1

我玩了一段时间的代码:

    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?

4

2 回答 2

3

p说明符printf期望一个void *。相反,您传递的是一个int(练习:为什么它是一个int?),因此行为是未定义的。为您要打印的内容使用正确的说明符(c也许xu)。

于 2013-09-03T08:28:40.433 回答
1

%p并且*ptr没有像OP期望的那样表现。

printf("\na[0]=%p",*ptr); // print the values at the next 4 memory locations

ptr地址的值为int n。注意: 的类型ptr仍然指向 a 的指针char*ptr说取消引用ptr得到一个char. 这char具有 0xFF 的 8 位值,因为它是 的字节之一n,它肯定是 0xFFFFFFFF (-1)。这char被提升为 ,int因为它是 的 varidac 参数printf()。因此 0xFF 变成 0xFFFFFFFF 就像int你机器上的一个 4 字节整数一样。 printf()看到%p格式说明符,因此期望在“VisualC++ '12”中看到一个 4 字节指针。这就是你的输出。在“x64”上,需要一个 8 字节的指针,但只定义了 4 个字节(0xFFFFFFFF)。它抓取的下一个 4 字节是未定义的,但结果是 0x00000000。因此你得到“00000000FFFFFFFF”。

下一行printf("\na[1]=%p",*(ptr+1))simple 获取下一个char0xFF n。然后发生相同的提升,int值为 0xFFFFFFFF。

怀疑OP想要

printf("\na[0] = 0x%08X",*  ((int *)ptr)  ); // print the values at the next 4 memory locations
于 2013-09-04T23:06:08.453 回答