在初始化数组的时候遇到后一个数组的指针与前一个重叠:
size_t n = 6;
size_t f1[n];
size_t f2[n];
size_t ls[2][n-1];
printf("&ls[1][5] = %p\n&f2[0] = %p", &ls[1][5], f2);
输出结果为:
&ls[1][5] = 0x7fff501f3730
&f2[0] = 0x7fff501f3730
用 malloc
动态分配或者将 size_t f2[n]
放到 ls
声明的后面不会有问题,那上面出现这个问题的原因是什么呢?
// 假设 size_t 为4个字节 ,即32bit
----- ^
n - 32bit |
----- |栈地址由低到高 (注意 栈却是向下生长的,
f1 - n * 32bit |也就是后声明的东西在低地址)
生 | -----
长 | f2 - n * 32bit
方 | -----
向 ∨ ls - 2 * (n - 1) * 32bit
-----
对ls来说 很显然ls[1][4]才是ls的最后一个元素 ls[1][5]已经越界了 是f2[0]所在位置
理解了上面,放到后面就更好理解了,f2在ls下面,这时候应该是ls0的地址和f2[n]相等