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

查看:88
本文介绍了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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆