这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 程序中定义数组的初始化问题?

共21条 2/3 1 2 3 跳转至
高工
2014-01-23 12:27:48     打赏
11楼

多谢支持,共同进步


高工
2014-01-24 15:28:14     打赏
12楼
谢谢!希望能看到更多的经验分享。

菜鸟
2014-02-11 20:55:21     打赏
13楼

感谢楼主分享自己的经验。不过有些问题还是值得商榷。

二进制的程序文件分为三部分,.bss,  .data, .

对于首行提出的问题,还是需要区分全局变量、局部变量的:

   对于全局变量、静态变量,若未赋初值,则默认值为0,编译后会放在了二进制文件的.bss段(block stand by symbol),只有变量名和大小信息,都是 0 嘛;若赋初值,则放于.data段,这是保存全局变量、静态变量初值信息的地方。例如对数组 a[1024],若未赋初值,则在bin文件中几个字节,若赋初值,则bin文件中就必须包含所有赋初值的信息,数据量就大了。在Keil中的bin文件的大小就是 Code + RO Data + RW Data。

   对于局部变量,都是在分配于栈上的,楼主的DataBuf数组应是一个局部变量,出现跑飞的情况的确是栈溢出,溢出进入了RAM中的全局变量、静态变量区,若数组初始化了,会改变该区域数据的值,然后就跑飞了。


   关于初始化时的全局变量、静态变量的加载,并不是由操作系统完成的,是bin文件中某处自动执行的,对于Cortex M3 , 该动作发生在startup.s文件中的__main之后。


专家
2014-02-17 21:54:28     打赏
14楼

不应该的!!你得RAM多大?还有你的是什么片子??

还有:STM32F103VET6+IAR6.3 的堆栈可以 设置!!


高工
2014-02-17 22:54:27     打赏
15楼

多多指教,多多支持


高工
2014-02-17 22:56:43     打赏
16楼
这个问题编译时不会报错,只有调试的时候才会跑飞,要是编译器能够给些提示就好了,多谢指教啊

菜鸟
2014-02-18 23:28:51     打赏
17楼
堆栈溢出、指针越界在编译时不会报错的,错误在程序运行时才能体现出来,可以用J-link单步调试进行分析。

高工
2014-02-19 18:40:30     打赏
18楼
恩,随着时间的积累,这种问题编译器应该可以优化的,目前就只能单步调试看结果了,多谢指点啊

助工
2014-02-20 22:18:12     打赏
19楼
学了c语言也用了这么久,第一次看到这么详细的对数组的解说!

高工
2014-02-21 11:33:09     打赏
20楼
64KRAM ,我用的就是VET6,可是确实遇到了上述情况,数组赋值了就跑飞了。 另外VET6+Iar6.3的堆栈如何设置呢

共21条 2/3 1 2 3 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]