以下代码如何给出答案为2036、2036、2036。

以下C代码的输出是什么?假定x的地址为2000(十进制),并且整数需要四个字节的内存。

int main()
{
   unsigned int x[4][3] = {{1, 2, 3}, {4, 5, 6},
                           {7, 8, 9}, {10, 11, 12}};
   printf("%u, %u, %u", x+3, *(x+3), *(x+2)+3);
}

最佳答案

正如您刚刚发现的那样,如果您不发布精心设计的代码,人们可能会对SO有点苛刻。要打印地址,请使用%p<inttypes.h>中的宏(例如PRIXPTR)并将其强制转换为uintptr_t

仅使用%p,您的代码可能应该显示为:

#include <stdio.h>

int main(void)
{
    unsigned int x[4][3] =
    {
        {  1,  2,  3 }, {  4,  5,  6 },
        {  7,  8,  9 }, { 10, 11, 12 }
    };
    printf("%p\n", (void *)x);
    printf("%p, %p, %p\n", (void *)(x+3), (void *)(*(x+3)), (void *)(*(x+2)+3));
    return 0;
}


现在您已经定义了行为,尽管这些值将不会像2000和2036这样方便。

但是,x+3是数组开始后3个int的第四个数组的地址,因此假设sizeof(int) == 4如所述,即x开始之后的36个字节—如果x为在2000年。

*(x+3)是第四个数组的起始地址;在相同的假设下,即2036年。

*(x+2)+3将3加到3 int的第三个数组的地址中,然后再添加3。在x的开头之后也结束了36个字节,如果x在2000处,则结束了2036。

在我的64位计算机上,输出为:

0x7fff5800a440
0x7fff5800a464, 0x7fff5800a464, 0x7fff5800a464


当然,十六进制0x24是36十进制。

关于c - 未知的C代码输出,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31284616/

10-09 03:24