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

共11条 1/2 1 2 跳转至

程序中定义数组的初始化问题?

高工
2014-01-18 03:41:05     打赏

    首先提出个问题:代码中定义的变量(暂不区分全局和局部)对其进行赋初值和不赋初值有什么区别呢?

    下面讲一下我的经历:我在代码中定义了一个一维数组 unsigned char Databuf[256],起初在定义时对其进行了赋初值:unsigned char Databuf[256]={0};结果在程序运行的时候跑飞了,死在了硬件故障中。

后来将上述语句改为:unsigned char Databuf[256];(取消赋初仅定义值),代码就通过了,这个是经过了痛苦的煎熬才敲定是它的原因,那么赋不赋初值有什么区别呢?

答:1、局部变量在调用函数时在栈上生成,初始化的全局变量才会编译进文件,因为他有初始化的信息,没有初始化的全局变量只是一个符号而已。

2、定义的数组太大会导致栈溢出!(估计我的就是这种问题),另外会导致程序编译过大。未赋初值的数组不会被编译进结果,赋了初值的就占用内存空间了。

3、下面是极其“恶劣”的程序

1) 定义巨大的全局ARRAY,并初始化一小部分。

2)定义很大的局部ARRAY。

总结一下:

1、如果数组定义成局部变量非静态变量,那么数组就会在栈上分配,当数组超过默认栈的大小时,会引起非常内存访问。

2、如果数组定义成全局变量或者局部静态变量,并且不初始化,数组在.bss段中分配,当程序加载时,由操作系统来完成。

3、如果数组太大,会造成程序无法加载,视系统不同,可能没有任何提示,也有可能提示内存空间不足。

4、如果数组定义成全局变量或者局部静态变量,并且初始化,数组在.data段中,由链接程序分配空间,当程序加载时,操作系统直接加载映像到内存或者使用内存映射技术。

5、如果数组太大,会造成程序无法加载,视系统不同,可能没有任何提示,也有可能提示内存空间不足。

终于可以睡觉了,晚安全世界,哈哈哈

最后提个问题吧:对于STM32F103VET6+IAR6.3定义多大堆栈才不会溢出呢?




关键词: 数组初始化     堆栈溢出    

高工
2014-01-18 13:51:36     打赏
2楼

起初是可以执行到任务的最后一条语句,也就是延时语句,接着就飞了

后来发现直接进不了初始化了,执行到void main(),单击单步运行,就飞了

我曾试着反汇编,太揪心了,纯粹自虐


高工
2014-01-18 21:36:40     打赏
3楼

是啊,记得有次你还帮我配置过串口的中断入口呢,现在又忘了咋配置的了,唉


高工
2014-01-18 21:38:15     打赏
4楼
这个问题确实比较纠结,开始是执行到任务最后的延时语句直接跑飞的,但是有时候还能通过,草蛋的很啊

高工
2014-01-19 14:41:08     打赏
5楼

多谢老大的支持,继续努力


高工
2014-01-23 12:27:48     打赏
6楼

多谢支持,共同进步


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

多多指教,多多支持


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

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

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

共11条 1/2 1 2 跳转至

回复

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