我玩了一段时间的代码:
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?
printf
的p
说明符需要一个void *
。相反,您传递的是int
(练习:为什么它是int
?),因此行为是未定义的。为要打印的内容使用正确的说明符(可能是c
、x
或u
?)。
%p
和*ptr
的行为未达到OP预期。
printf("na[0]=%p",*ptr); // print the values at the next 4 memory locations
CCD_ 11的地址值为CCD_。注意:ptr
的类型是仍然指向char
的指针。*ptr
表示取消引用ptr
得到char
。该char
具有0xFF的8位值,因为它是n
的字节之一,当然是0xFFFFFFFF(-1)。该CCD_ 20被提升为CCD_ 21,因为它是CCD_。因此,0xFF变为0xFFFFFFFF,因为int
在您的机器上可能是一个4字节的整数。printf()
看到%p
格式说明符,因此期望在"VisualC++’12"中看到一个4字节指针。这就是你的输出。在"x64"上,需要一个8字节的指针,但只定义了4个字节(0xFFFFFFFF)。它抓取的下一个4字节是未定义的,但结果是0x00000000。这样你就得到了"00000000FFFFFFFF"。
下一行printf("na[1]=%p",*(ptr+1))
simple得到n
的下一个char
,也是0xFF。然后发生对int
的相同提升,其值为0xFFFFFFFF。
怀疑OP想要
printf("na[0] = 0x%08X",* ((int *)ptr) ); // print the values at the next 4 memory locations