微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

剩余堆栈的大小,直到发生堆栈溢出

在Linux上,使用C,假设我有一个dynamic确定的元素,我必须在一个数组( int my_array[n] )中存储一些元素,例如一个函数调用,即被调用函数只使用很less的内存(几百字节)。

大多数n很less,十分之一。 但有时候n可能很大,多达1000或1000。

如何计算,我的堆栈是否可以保存n*o + p个字节而不会溢出?

基本上:我的堆栈上剩下多less字节?

在Ubuntu 11.04中禁用堆栈碎片保护

程序栈的增长方向究竟是什么?

单声道:是否有可能在没有root权限的端口上运行服务?

将堆栈移动到特定的位置

如何确定堆栈指针的初始值?

gcc cc1:内存不足分配

如何访问/打印main中的辅助vector条目?

什么是“ulimit -s unlimited”呢?

MS应用程序validation器膨胀堆栈?

每个进程是否存在内核堆栈?

事实上, 检查可用的堆栈问题给出了很好的答案。

但更实际的答案是: 不要在调用堆栈上分配大数据

在你的情况下,当n<100 (然后在堆栈上分配,也许通过alloca ,是合理的 )和n>=100的情况下,你可以用不同的方式处理这个事件(然后,用malloc (或者calloc )不要忘了free它)。 使阈值100为#define -d常量。

调用堆栈上的典型调用框架应该在当前的笔记本电脑或台式机上最多为几千字节(如果您有递归或线程,最好少一些)。 总的堆栈空间通常至多是几兆字节(有时候少得多:在内核中,堆栈通常是每个4K字节!)。

如果你不使用线程,或者你知道你的代码在主栈上执行,那么

进入main时记录当前的堆栈指针

在你的例程中,获取当前的堆栈限制(请参阅man getrlimit )

比较当前堆栈指针与步骤1中记录的指针之间的差异,并使用步骤2中的限制。

如果您正在使用线程并可能在除main之外的线程上执行,请参阅man pthread_getattr_np

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐