2011-12-03 33 views
7

在Linux上,使用C,假设我有一个动态确定的n命名元素的数量,我必须在短时间内存储在一个数组(int my_array[n])中,一个函数调用,即被调用的函数只使用很少的内存(几百字节)。直到发生堆栈溢出为止的剩余堆栈大小

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

我该如何计算,我的堆栈是否可以容纳n*o + p字节而没有溢出?

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

+0

可能的重复[在C中检查可用堆栈大小](http://stackoverflow.com/questions/53827/checking-available-stack-size-in -c) –

+0

@BrendanLong,我看到了这个问题,但是因为它声明“我正在使用MinGW和GCC 3.4.5(mingw-special vista r3)”,所以答案有点以Windows为中心。我的问题是Linux/* nix居中。 ;-) – kay

+0

为什么不能使用'getrusage()'和'getrlimit()'? – sverre

回答

4

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

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

在你的情况,你可以处理不同的情况下n<100(然后在堆栈上分配,也许是通alloca,是有道理的),当n>=100(当时,在堆上分配与malloc(或calloc的情况下)和别忘了free吧)。使阈值100 a #define -d不变。

call stack上的典型调用帧应该在当前的笔记本电脑或台式机上最多为几千字节(如果有递归或线程,最好不要这么做)。总的堆栈空间通常最多为几兆字节(有时少得多:在内核内部,每个堆栈通常为4K字节!)。

+1

混合'calloc'和'alloca'是个坏消息,因为初始化数据,而另一个不是。这可能会引入怪异的错误。 – Dave

+2

好吧,它可能是'malloc'&'alloca'。 –

4

如果当进入主

  • 在你的日常你不使用线程,或者如果你知道你的代码执行主栈,然后

    1. 记录当前堆栈指针,获取当前栈限制(见man getrlimit)当前堆栈指针和一个如果使用threa从步骤2

    记录在第1步中与限位之间

  • 比较差ds并且可能在主线程以外的线程上执行,请参阅man pthread_getattr_np