想要截断地址,以便清晰无法按预期工作

时间:2012-01-01 16:38:39

标签: c hex truncate pointer-address

为了清晰起见,希望截断地址。 不寻找改进的代码, 为什么十六进制代码减法似乎无法正常工作。

第一个结果是'零'从' 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年新年快乐

2 个答案:

答案 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
      );

示范:http://ideone.com/t8gQn

摆脱警告:

(unsigned)((intptr_t)someptr & 0xffffU)