2016 - 2024

感恩一路有你

如何计算栈溢出长度 STM32局部变量的数组最大能到多少?

浏览量:2684 时间:2023-09-12 19:11:41 作者:采采

STM32局部变量的数组最大能到多少?

依据什么你需要提供的信息,推断你在用的肯定是TinyCComplier编译器,这是一个32位的编译器,这样的话int应该为32位,4个字节。

先去看看数组的大小,inta[664579],这样大小为664579×42658316,也就是2.5M

C语言的局部变量在在栈上分配空间,TCC默认的栈大小为1M,看来会造成栈逸出,程序崩溃。

最新版的TCC可以提供了自定义栈大小的参数,如下面:

tcc-Wl,--stack4194309

将栈大小委托为4M。

真不知道你的TCC版本是否允许这个参数。

而全局变量在堆上分配空间,Win32应用程序可访问的地址空间是4G,一般来说进程求实际能不使用的是仍旧达不了这个值,但在放一个2.5M的数组我还是不成问题的。因为以及全局变量程序可正常运行。

所以才程序中要不使用规模大数组,不是的话符号表示为全局变量,要嘛不使用malloc一类的函数在堆上日志分配空间。

为什么会出现“Stack overflow”的异常提示?

stack overflow是栈流出错误,stack是系统调用函数时手动以维护的,当不可能发生stack overflow时将近长度的数据会遍布函数前往地址。

Java里还有大约20%可用内存的情况下显示内存溢出,是怎么回事?应该怎么办?

JVM中的内存和计算机的内存并非一回事,JVM(JAVA虚拟机)只不过启动在服务器中的一个进程,只占用资源一部分的内存,其中堆常见占了整个jvm内存的80%!

举例再看看,计算机是8G内存只给jvm分配了4G内存,jvm占内存了4G内存之后,虽说整个内存才不使用50%(忽略其他的),jvm也将发生内存泄漏!

jvm程序报错有哪些很可能情况呢?

①,堆滴下:堆为了存储实例对象!

可能原因一:设置中的大堆内存太小!解决方案:通过可以设置-Xmx调大的最堆内存!

可能原因二:循环创建家族对象导致对象没来得及回收!解决方案:优化系统代码!

②,栈流出:栈要注意用来储存时对象引用!

可能会原因:递归过程动态创建方法等很难出现栈溢出!

解决方法:360优化代码!

③,方法区滴下:大多是因为运行程序了大量的Class,jar等!

大多数不会逸出,建议使用-XX:Permsize设置里比较合适的绝版代!

才发现内存溢出之后,可在用jstamp,MATJAVA等接受内存讲

一直在在坚持了彼此分享JAVA方面的技术,有要的朋友劳请关注。。

版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。