问题:
今天同事在写一个STM32上的程序时,总是遇到内存溢出的错误。结果发现是因为使用了一个局部变量导致的。
因为C语言的局部变量被编译器自动放到栈区的空间(全局变量需要手动申请并释放空间)。嵌入式系统的栈区本来就很小,而且要放进去的变量是一个结构体类型,非常庞大(大数组也会导致相同错误)。所以直接栈区溢出了(或是地址重叠错误)。而且这样的错误在编译的过程中不会有任何错误,只有跑起来才出现……
在这一点上,嵌入式C语言程序有别于其他系统上的。
在我之前的经验中,也曾经犯过类似的错误。在写OS161作业的时候,参数列表中有一个结构体类型的参数,结果在极限测试中,调小了内存后(即:模拟成一个嵌入式系统)出现栈溢出异常。也是编译没有问题,跑用来测试的用户程序时出现错误了。因为函数参数列表中得内容也是放在栈区的。
因为作为一个一般的程序员,其实得到的大部分意见是要避免使用全局变量的。原因很多,摘录了网上的一些说法,基本都涵盖了。
http://blog.sina.com.cn/s/blog_45a7cd600101dp0u.html
实际上在之前写项目的时候,对于一些共用的变量和常量还是喜欢以全局的方式来处理。例如当前浏览器的类型、浏览器的窗口宽度、高度等等。这些东西用全局的方式约定好了毕竟还是比较方便的。但是从安全性和项目管理的便利性来说,也许作为局部变脸(类似JQuery和YUI的方式)有可能会好些。
6.1
作者列举了全局变量带来的几个问题,包括命名冲突、代码脆弱性、测试困难等。因此,个人建议,对于小型项目而言,可以适量地使用一些全局变量。对于大型项目而言,处于项目管理的需要,建议还是用单全局变量比较好,把绝大多数全局变量修改为局部变量,用类、命名空间等来进行封闭,防止变量的污染。
6.2
在这里还是强调使用变量一定要预先声明,避免Javascript在处理未声明的变量时直接将其作为全局变量处理。使用严格模式可以有效地避免这一状况。因此在调试和开发脚本时,建议采用IE10等更新版本支持严格模式的Web浏览器,并采用严格模式来开发,对每一个第一次使用的变量都用var关键字尽心声明。
6.3 单全局变量方式
但全局变量模式是目