关于STM32局部变量,如果数组太大并且堆栈溢出怎么办?

电脑杂谈  发布时间:2020-07-28 20:06:37  来源:网络整理

栈溢出了_c 栈溢出_堆溢出 栈溢出

在函数中声明较大的局部数组变量时,可以编译并传递该程序,但是在运行时,该程序始终会进入hardfaulthandler,导致问题的原因可能是堆栈溢出. 因为局部变量存储在堆栈区域中,而全局变量存储在全局区域(静态区域)中,所以如果堆栈区域较小,则会发生溢出.

解决此问题的方法:

方法1: 启动文件中的堆栈大小有一个固定值. 调用函数时,函数中的数组会为您分配空间. 增加启动文件下堆栈的大小

栈溢出了_c 栈溢出_堆溢出 栈溢出

Stack_Size EQU 0x00000400.

堆栈大小,通常对于小型项目,0X400就足够了,对于大型项目栈溢出了,0X1000就足够了,因此默认情况下无需设置得太大.

方法2: 使用静态数组代替普通的本地数组.

堆溢出 栈溢出_栈溢出了_c 栈溢出

关于STM32局部变量问题 数组过大,栈溢出了怎么办

方法3: 数组太大,堆栈溢出,它可能会覆盖其他全局变量的值. 如果使用非常大的数组,则可以将其定义为全局变量. 如果您使用的是os. 只需使用内存管理即可.

堆是在程序运行时申请一定大小的内存空间,而不是在编译程序时申请. 也就是说栈溢出了,内存是动态分配的,对其的访问与对常规内存的访问没有区别. {堆是指程序运行时申请的动态内存,而堆栈是指使用堆的方法(即先进先出). }

栈溢出了_堆溢出 栈溢出_c 栈溢出

堆栈是先进先出的,但是堆栈没有此功能. 两者都是用于存储临时数据的地方. 对于堆,我们可以根据需要添加变量和删除变量,无论大小,只要您愿意,就不必遵循任何顺序

*堆栈,用于存储局部变量,局部数组等.

*堆,用于保存自定义内存变量,例如new和malloc;

栈溢出了_c 栈溢出_堆溢出 栈溢出

*全局静态区域用于保存全局变量和静态变量;

*字符常量区,用于保存字符串;

*代码区,用于保存程序的二进制代码;


本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-288788-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      热点图片
      拼命载入中...