【发布时间】:2017-06-14 16:04:27
【问题描述】:
背景:老牌程序员,重温 C 语言,除了更好地理解幕后真正发生的事情之外,没有任何特定目的。
考虑这个程序。
#include <stdio.h>
int main()
{
//https://stackoverflow.com/questions/2581769/dereference-a-pointer-inside-a-structure-pointer
int concreteInteger = 42;
int* pointerInteger;
pointerInteger = &concreteInteger;
printf("concreteInteger as %%i = %i\n",concreteInteger);
printf("pointerInteger as %%p = %p\n" ,(void*)pointerInteger);
printf("pointerInteger as %%u = %u\n" ,(unsigned)pointerInteger);
printf("*pointerInteger as %%i = %i\n",*pointerInteger);
printf("Done\n");
return 0;
}
当我在 OS X 10.11 上编译和运行这个程序时,我得到以下输出。
$ cc main.c;./a.out
concreteInteger as %i = 42
pointerInteger as %p = 0x7fff5d614878
pointerInteger as %u = 1566656632
*pointerInteger as %i = 42
Done
1566656632 来自哪里?如果我convert 1566656632 to hex 我得到0x5D614878,而不是0x7fff5d614878。
那么1566656632 来自哪里?我在上面做了什么不正确的假设?将指针转换为无符号数是否在 C 中未定义?如果是这样,对于奖励积分,如果我想将指针的十六进制地址表示为以 10 为底的数字,那么最直接的方法是什么?
【问题讨论】:
-
你得到 0x50835878 因为这是 0x7fff50835878 的低 4 个字节
-
谢谢@ChrisTurner -- 你和 chux 在下面的 cmets 让我意识到假设指针地址适合 int 是多么令人费解!
-
@AlanStorm,您的输出和讨论中的地址不匹配。也许不同的运行。请先解决这个问题。造成如此多的混乱。
-
@AjayBrahmakshatriya D'oh!对于那个很抱歉。我认为它是固定的。从多次运行中复制/粘贴。