C语言初始化数组导致指针重叠
本文介绍了C语言初始化数组导致指针重叠的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
问 题
在初始化数组的时候遇到后一个数组的指针与前一个重叠:
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]相等
这篇关于C语言初始化数组导致指针重叠的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文