C 为清晰起见,希望截断地址,但未按预期工作

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 为了清晰起见,想要截断不需要

为了清晰起见,想要截断地址。 不寻求改进的代码, 这就是为什么十六进制代码减法似乎不能正常工作

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

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:是的,这正是你想要做的,只保留指针的一部分。如果你想让那个警告消失,我可以再加一些演员。