为了清晰起见,希望截断地址。 不寻找改进的代码, 为什么十六进制代码减法似乎无法正常工作。
第一个结果是'零'从' cname'中扣除和' arptr':
address of 'cname' is 0x7fff5fbff720
and of 'arptr' is 0x7fff5fbff720
为了清晰起见,希望截断不需要的数字 我减去了0x7fff5fbf0000,以为我会得到 0x00000000f720,但是:
第二个结果是' trunker'从' cname'中扣除和' arptr':
address of 'cname' is 0xffff00014082f720
and of 'arptr' is 0xffff00014082f720
#include <stdio.h>
#define trunker 0x7fff5fbf0000
#define zero 0x000000000000
int main(void) {
char cname[3][3] = {'a','b','c','e','f','g','i','j','k'};
char (* arptr)[3];
arptr = cname;
printf("address of cname is %p\nand of arptr is %p\n",
cname-zero,arptr-zero); //replace zero with trunker
//to truncate first 8 digits
return 0;
}
在OS X上使用Xcode
谢谢你,2012年新年快乐
答案 0 :(得分:4)
指针运算以指向的东西为单位执行,而不是以字节/字符为单位。
您可以尝试这样做:
printf("address of cname is %p\nand of arptr is %p\n",
(char*)cname-zero, (char*)arptr-zero);
答案 1 :(得分:2)
根据标准,你不应该使用指针算法来计算原始对象之外的地址(或者最多只有一个结束时)。但是如果你先转换为一个整数,你可以做任何你想做的事情(之后转换回指针是合法的,但是不可取。根据标准是不安全派生的指针。)
更好:
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)