【发布时间】:2020-03-17 10:31:03
【问题描述】:
考虑下面的 c 代码。
#include <stdio.h>
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);
printf("\n%u, %u, %u", x,&x,*x);
return 0;
}
现在每个 printf 语句都打印出与下面提到的相同的值。
6356724, 6356724, 6356724
6356688, 6356688, 6356688
Process returned 0 (0x0) execution time : 0.128 s
Press any key to continue.
我想知道每个 printf 语句的结果如何相同。 这是我对二维数组内存布局的理解。
现在我相信 x+3 指的是(x + 3 * 指针运算所需的大小)= 24 的基地址 和 *(x +3 ) = *(24) = 2036 但不是第一个 printf 语句打印 2036, 2036 2036 的情况。我想直观地了解二维数组是如何组织的。
【问题讨论】:
-
如果您尝试打印指针值,请使用 %p 而不是 %u
-
@Eraklon 它以十六进制格式打印地址:0060FEF4, 0060FEF4,0060FEF4 0060FED0, 0060FED0, 0060FED0 进程返回 0 (0x0) 执行时间:0.119 s 按任意键继续。
-
x + 3与x[3]相同,也与*(x + 3)相同。*(x + 2) + 3是x[2] + 3,因为数组是 3 宽,因此这个加法基本上返回x[3]。鉴于机器上的 int 是 4 字节大小,您对内存布局的理解似乎是正确的。混乱来自指针算术。 -
@Eraklon "
x + 3与x[3]相同" ??? -
这段代码的行为是未定义的。它可以打印任何东西,或者什么都不打印,或者融化你的硬盘。
标签: c arrays multidimensional-array data-structures