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

时间:2011-12-03 04:28:29

标签: c linux stack stack-size

在Linux上,使用C,假设我有一个动态确定的n命名我必须存储在一个数组(int my_array[n])中的元素数量,只是在短时间内,例如,一个函数调用,其中被调用函数仅使用很少的内存(几百个字节)。

大多数n很少,只有十分之一。但有时n可能很大,可能会达到1000或1000'000。

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

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

2 个答案:

答案 0 :(得分:4)

确实,checking available stack问题给出了很好的答案。

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

在你的情况下,你可以处理n<100(然后在堆栈上分配,或许通过alloca有意义)和n>=100时的情况(当时,使用malloc(或calloc)在堆上进行分配,不要忘记free它。使阈值100成为#define - d不变。

call stack上的典型呼叫帧应该在当前的笔记本电脑或台式机上最多几千字节(如果你有递归或线程,最好少一些)。总堆栈空间通常最多只有几兆字节(有时甚至更少:在内核中,堆栈通常每个都是4K字节!)。

答案 1 :(得分:4)

如果您没有使用线程,或者您知道您的代码在主堆栈上执行,那么

  1. 输入main
  2. 时记录当前堆栈指针
  3. 在您的例程中,获取当前堆栈限制(请参阅man getrlimit
  4. 将当前堆栈指针与步骤1中记录的指针与步骤2的限制进行比较。
  5. 如果您正在使用线程并且可以在除main之外的线程上执行,请参阅man pthread_getattr_np