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

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

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

高工
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 09:43:32     打赏
2楼

调试的时候可以跟踪一下嘛!

是不是读数组的时候跑飞了~~

还有就是调试窗口可以观察内存的变量。


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

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

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

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


院士
2014-01-18 19:42:05     打赏
4楼

的确 如果堆栈 溢出的话 会出现这个现象。


还有就是你的中断入口向量配置错误,也会出现进不了main函数的问题


高工
2014-01-18 21:24:16     打赏
5楼
我以前遇到过一个定义变量的问题,原因是数组溢出,当时是读一些数据到数组里,但是读完后,我的一个全局变量的值给改变了,可以通过仿真查看变量的地址。

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

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


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

院士
2014-01-19 14:24:26     打赏
8楼
当我要设精的时候,发现有人先设了

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

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


助工
2014-01-22 08:56:10     打赏
10楼
学习,路过~

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

回复

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