开发者社区> 问答> 正文

C语言初始化数组导致指针重叠

c

Yushneng 4月4日提问

关注 2 关注
收藏 1 收藏,164 浏览

问题对人有帮助,内容完整,我也想知道答案 0 问题没有实际价值,缺少关键内容,没有改进余地

在初始化数组的时候遇到后一个数组的指针与前一个重叠:

  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 声明的后面不会有问题,那上面出现这个问题的原因是什么呢?

展开
收起
杨冬芳 2016-05-30 14:17:32 2496 0
1 条回答
写回答
取消 提交回答
  • IT从业
           // 假设 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]相等

    2019-07-17 19:20:31
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载