深入理解C语言中的堆和栈

      几天前做一个测试的时候发现某个变量被赋值以后,无端被修改。这段测试代码大体如下:

    void test(void)
    {  u16 data[3000] = {0};
       u16 cnt = 0;
       u16 k = 0;

       for (k = 0; k < 30; k++)
       {  get(data + k*100,100);//采集100个数据到数据存储区
          cnt += 100;
       }
    }


      以上代码无法正常执行,调试过程中发现cnt变量莫名其妙地被修改了,经过多方查找原因,发现问题原来出在函数内的局部变量定义上。程序运行环境是单片机,单片机的内存较小,软件设置的堆和栈的空间均为400字节,而我在程序中却申请到了3000个字(2byte)的空间,这就导致了堆栈分配发生错误,后边运行出现各种无法解释的错误也就成为了必然。该程序只需要将数组data定义变为全局变量便可以正确执行了。
      为了防止类似的错误发生,大的数组尽量不要在函数内部定义。

以上的方法只能治标,根本解决问题还在于清楚的理解C语言内存的分配策略。理解了内存分配方法,自然就不会犯类似的错误了。查阅相关资料,内存的分配方式有三种,现转录与此:

(1) 从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的 整个运行期间都存在。例如全局变量,static 变量。

(2) 在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函 数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集 中,效率很高,但是分配的内存容量有限。

(3) 从堆上分配,亦称动态内存分配。程序在运行的时候用malloc 或new 申请任意多 少的内存,程序员自己负责在何时用free 或delete 释放内存。动态内存的生存期 由我们决定,使用非常灵活,但问题也最多。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值