首先提出个问题:代码中定义的变量(暂不区分全局和局部)对其进行赋初值和不赋初值有什么区别呢?
下面讲一下我的经历:我在代码中定义了一个一维数组 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定义多大堆栈才不会溢出呢?