C 为清晰起见,希望截断地址,但未按预期工作
为了清晰起见,想要截断地址。 不寻求改进的代码, 这就是为什么十六进制代码减法似乎不能正常工作 从“cname”和“arptr”中减去“零”的第一个结果:C 为清晰起见,希望截断地址,但未按预期工作,c,hex,truncate,pointer-address,C,Hex,Truncate,Pointer Address,为了清晰起见,想要截断地址。 不寻求改进的代码, 这就是为什么十六进制代码减法似乎不能正常工作 从“cname”和“arptr”中减去“零”的第一个结果: address of 'cname' is 0x7fff5fbff720 and of 'arptr' is 0x7fff5fbff720 address of 'cname' is 0xffff00014082f720 and of 'arptr' is 0xffff00014082f720 为了清晰起见,想要截断不需要
address of 'cname' is 0x7fff5fbff720
and of 'arptr' is 0x7fff5fbff720
address of 'cname' is 0xffff00014082f720
and of 'arptr' is 0xffff00014082f720
为了清晰起见,想要截断不需要的数字
我减去0x7fff5fbf0000,我想我会得到
0x00000000f720,但:
从“cname”和“arptr”中减去“trunker”的第二个结果:
address of 'cname' is 0x7fff5fbff720
and of 'arptr' is 0x7fff5fbff720
address of 'cname' is 0xffff00014082f720
and of 'arptr' is 0xffff00014082f720
#包括
#定义中继线0x7fff5fbf0000
#定义零0x000000000000
内部主(空){
char cname[3][3]={'a','b','c','e','f','g','i','j','k'};
字符(*arptr)[3];
arptr=cname;
printf(“cname的地址是%p\n,arptr的地址是%p\n”,
cname zero,arptr zero);//用trunker替换zero
//截断前8位
返回0;
}
在OSX上使用Xcode
感谢并祝您2012年新年快乐指针运算是以指向的对象为单位执行的,而不是以字节/字符为单位 您可以尝试以下方法:
printf("address of cname is %p\nand of arptr is %p\n",
(char*)cname-zero, (char*)arptr-zero);
指针运算是以指向的对象为单位执行的,而不是以字节/字符为单位 您可以尝试以下方法:
printf("address of cname is %p\nand of arptr is %p\n",
(char*)cname-zero, (char*)arptr-zero);
根据该标准,您不应使用指针算法来计算原始对象之外的地址(或最多超过末尾一个地址)。但是如果你先转换成整数,你可以做任何你想做的事情(之后再转换回指针是合法的,但不可取。根据标准,这是一个不安全的派生指针。) 更好:
printf("address of cname is %zx\nand of arptr is %zx\n",
(intptr_t)cname-trunker,
(intptr_t)arptr-trunker
);
但是,如果您只想显示最后四位数字,这就更好了:
printf("address of cname is %04x\nand of arptr is %04x\n",
(unsigned)cname & 0xffffU,
(unsigned)arptr & 0xffffU
);
演示:
消除警告:
(unsigned)((intptr_t)someptr & 0xffffU)
根据该标准,您不应使用指针算法来计算原始对象之外的地址(或最多超过末尾一个地址)。但是如果你先转换成整数,你可以做任何你想做的事情(之后再转换回指针是合法的,但不可取。根据标准,这是一个不安全的派生指针。) 更好:
printf("address of cname is %zx\nand of arptr is %zx\n",
(intptr_t)cname-trunker,
(intptr_t)arptr-trunker
);
但是,如果您只想显示最后四位数字,这就更好了:
printf("address of cname is %04x\nand of arptr is %04x\n",
(unsigned)cname & 0xffffU,
(unsigned)arptr & 0xffffU
);
演示:
消除警告:
(unsigned)((intptr_t)someptr & 0xffffU)
就这样。谢谢你的课。现在的输出是:cname的地址是0xf720,arptr的地址是0xf720。谢谢你的课。现在的输出是:cname的地址是0xf720,arptr的地址是0xf720,这导致了编译器错误,“格式中未知的转换类型参数0xa”。在包含header@Joel之后,请尝试“更好”版本。我会研究一下,但我认为您的编译器中有一个不兼容的静态检查器。@Joel:找到它了,
z
是一个修饰符,需要与%x
格式说明符配对。第二个给了我一个编译器警告“从指针转换到不同大小的整数”。@Joel:是的,这正是你想要做的,只保留指针的一部分。如果你想消除这个警告,我可以添加更多的强制转换。这会导致一个编译器错误,“格式中未知的转换类型参数0xa”。在包含header@Joel之后,请尝试“更好”的版本。我会研究一下,但我认为您的编译器中有一个不兼容的静态检查器。@Joel:找到它了,z
是一个修饰符,需要与%x
格式说明符配对。第二个给了我一个编译器警告“从指针转换到不同大小的整数”。@Joel:是的,这正是你想要做的,只保留指针的一部分。如果你想让那个警告消失,我可以再加一些演员。