win32 vs x64代码比较

时间:2013-09-03 07:16:09

标签: c 64-bit

我正在玩一些代码一段时间:

    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?

2 个答案:

答案 0 :(得分:3)

p的{​​{1}}说明符需要printf。相反,你传递void *(练习:为什么它是int?),因此行为是未定义的。对于您要打印的内容,请使用正确的说明符(intcx,也许?)。

答案 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