以下代码如何给出答案为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/