猿问

在C中检查可用的堆栈大小

我正在将MinGW与GCC 3.4.5(mingw-special vista r3)一起使用。

我的C应用程序使用了很多堆栈,所以我想知道是否有什么方法可以通过编程方式告诉您还剩下多少堆栈,以便在发现即将用完时可以完全解决这种情况。

如果不是,您还可以通过其他什么方法来解决可能耗尽堆栈空间的问题?

我不知道我要从多大的堆栈开始,因此也需要以编程方式识别它。


明月笑刀无情
浏览 782回答 3
3回答

三国纷争

雷蒙·陈(The Old New Thing)对于此类问题有一个很好的答案:如果需要询问,可能是您做错了。这是有关堆栈分配的Win32详细信息:MSDN。如果您认为自己可能受到堆栈空间的限制,那么几乎可以肯定会受到可用虚拟内存的限制,在这种情况下,您将需要找到其他解决方案。您到底想做什么?

江户川乱折腾

getrusage函数可获取当前用法。(请参见man getrusage)。在getrlimitLinux中,将有助于获取与堆栈大小RLIMIT_STACK参数。#include <sys/resource.h>int main (void){&nbsp; struct rlimit limit;&nbsp; getrlimit (RLIMIT_STACK, &limit);&nbsp; printf ("\nStack Limit = %ld and %ld max\n", limit.rlim_cur, limit.rlim_max);}请看一下man getrlimit。相同信息可以按行ulimit -s或ulimit -a堆栈大小行获取。也看一下setrlimit可以设置限制的功能。但是,如其他答案中所述,如果您需要调整堆栈,那么您可能应该重新考虑您的设计。如果要一个大数组,为什么不从堆中取出内存呢?

慕村9548890

将局部变量的地址从堆栈中取出将起作用。然后,在一个更嵌套的调用中,您可以减去另一个本地的地址,以找出它们之间的差异size_t top_of_stack;void Main(){&nbsp; int x=0;&nbsp; top_of_stack = (size_t) &x;&nbsp; do_something_very_recursive(....)}size_t SizeOfStack(){&nbsp; int x=0;&nbsp; return top_of_stack - (size_t) &x;}&nbsp;如果您的代码是多线程的,则需要处理每个线程的top_of_stack变量。
随时随地看视频慕课网APP
我要回答