嵌入式系统C语言编程小心使用局部变量

本文通过实例讲述了在嵌入式系统中,由于C语言局部变量(尤其是大结构体)导致的栈溢出问题。栈区空间有限,大型局部变量会引发错误,这种错误在编译时难以察觉,运行时才会暴露。建议减少局部大变量的使用,必要时改为全局变量或调整栈空间大小。
摘要由CSDN通过智能技术生成

问题:

今天同事在写一个STM32上的程序时,总是遇到内存溢出的错误。结果发现是因为使用了一个局部变量导致的。

因为C语言的局部变量被编译器自动放到栈区的空间(全局变量需要手动申请并释放空间)。嵌入式系统的栈区本来就很小,而且要放进去的变量是一个结构体类型,非常庞大(大数组也会导致相同错误)。所以直接栈区溢出了(或是地址重叠错误)。而且这样的错误在编译的过程中不会有任何错误,只有跑起来才出现……

在这一点上,嵌入式C语言程序有别于其他系统上的。

在我之前的经验中,也曾经犯过类似的错误。在写OS161作业的时候,参数列表中有一个结构体类型的参数,结果在极限测试中,调小了内存后(即:模拟成一个嵌入式系统)出现栈溢出异常。也是编译没有问题,跑用来测试的用户程序时出现错误了。因为函数参数列表中得内容也是放在栈区的。


因为作为一个一般的程序员,其实得到的大部分意见是要避免使用全局变量的。原因很多,摘录了网上的一些说法,基本都涵盖了。

http://blog.sina.com.cn/s/blog_45a7cd600101dp0u.html

实际上在之前写项目的时候,对于一些共用的变量和常量还是喜欢以全局的方式来处理。例如当前浏览器的类型、浏览器的窗口宽度、高度等等。这些东西用全局的方式约定好了毕竟还是比较方便的。但是从安全性和项目管理的便利性来说,也许作为局部变脸(类似JQueryYUI的方式)有可能会好些。

6.1  全局变量带来的问题

作者列举了全局变量带来的几个问题,包括命名冲突、代码脆弱性、测试困难等。因此,个人建议,对于小型项目而言,可以适量地使用一些全局变量。对于大型项目而言,处于项目管理的需要,建议还是用单全局变量比较好,把绝大多数全局变量修改为局部变量,用类、命名空间等来进行封闭,防止变量的污染。

 

6.2  意外的全局变量

在这里还是强调使用变量一定要预先声明,避免Javascript在处理未声明的变量时直接将其作为全局变量处理。使用严格模式可以有效地避免这一状况。因此在调试和开发脚本时,建议采用IE10等更新版本支持严格模式的Web浏览器,并采用严格模式来开发,对每一个第一次使用的变量都用var关键字尽心声明。

 

6.3 单全局变量方式

但全局变量模式是目

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿Boris

我们都是技术人,我们相互支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值