我正在玩一些代码一段时间:
int n;
char *ptr;
scanf("%d",&n);
ptr = (char *) &n; // pointer to the integer
printf("\na[0]=%p",*ptr); // print the values at the next 4 memory locations
printf("\na[1]=%p",*(ptr+1));
printf("\na[2]=%p",*(ptr+2));
printf("\na[3]=%p",*(ptr+3));
这段代码给了我一个干净的输出
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
在VisualC ++ '12中的win32设置上输入-1。
但是,当我为x64架构编译此代码时,我得到了 -
00000000FFFFFFFF
00000000FFFFFFFF
00000000FFFFFFFF
00000000FFFFFFFF
对于相同的输入值-1。两种体系结构的整数大小相同。 我的问题是为什么内存布局在4个位置都不是全部F?
答案 0 :(得分:3)
p
的{{1}}说明符需要printf
。相反,你传递void *
(练习:为什么它是int
?),因此行为是未定义的。对于您要打印的内容,请使用正确的说明符(int
,c
或x
,也许?)。
答案 1 :(得分:1)
%p
和*ptr
的行为不符合OP的预期。
printf("\na[0]=%p",*ptr); // print the values at the next 4 memory locations
ptr
的地址值为int n
。注意:ptr
的类型仍然是指向char
的指针。 *ptr
说要取消引用ptr
获取char
。这个char
的8位值为0xFF,因为它是n
的字节之一,当然是0xFFFFFFFF(-1)。此char
会提升为int
,因为它是printf()
的varidac参数。因此,0xFF变为0xFFFFFFFF,因为int
可能是您机器上的4字节整数。 printf()
看到%p
格式说明符,因此期望在“VisualC ++ '12”中看到一个4字节的指针。那就是你的输出。在“x64”上,需要一个8字节的指针,但只定义了4个字节(0xFFFFFFFF)。它抓取的下一个4字节是未定义的,但结果是0x00000000。因此你得到“00000000FFFFFFFF”。
下一行printf("\na[1]=%p",*(ptr+1))
simple获取char
的下一个n
,也是0xFF。然后发生与int
相同的促销,其值为0xFFFFFFFF。
怀疑OP想要
printf("\na[0] = 0x%08X",* ((int *)ptr) ); // print the values at the next 4 memory locations