0

为了清楚起见,想要截断地址。不是在寻找改进的代码,只是为什么十六进制代码减法似乎无法正常工作。

从“cname”和“arptr”中减去“零”的第一个结果:

address of 'cname' is 0x7fff5fbff720
and of 'arptr' is     0x7fff5fbff720

为了清楚起见,想要截断不需要的数字,我减去 0x7fff5fbf0000 以为我会得到 0x00000000f720,但是:

从“cname”和“arptr”中减去“trunker”的第二个结果:

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

4

2 回答 2

4

指针运算以所指向的事物为单位执行,而不是以字节/字符为单位。

你可以试试这个:

printf("address of cname is %p\nand of arptr is     %p\n",
    (char*)cname-zero, (char*)arptr-zero);
于 2012-01-01T16:56:48.717 回答
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)
于 2012-01-01T18:01:43.430 回答