c-win32与x64代码的比较



我玩了一段时间的代码:

    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?

printfp说明符需要一个void *。相反,您传递的是int(练习:为什么它是int?),因此行为是未定义的。为要打印的内容使用正确的说明符(可能是cxu?)。

%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

最新更新