为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C
明月笑刀无情 2019-10-11 10:05:25
我正在将MinGW与GCC 3.4.5(mingw-special vista r3)一起使用。我的C应用程序使用了很多堆栈,所以我想知道是否有什么方法可以通过编程方式告诉您还剩下多少堆栈,以便在发现即将用完时可以完全解决这种情况。如果不是,您还可以通过其他什么方法来解决可能耗尽堆栈空间的问题?我不知道我要从多大的堆栈开始,因此也需要以编程方式识别它。
查看完整描述

3 回答

?
三国纷争

TA贡献1804条经验 获得超7个赞

雷蒙·陈(The Old New Thing)对于此类问题有一个很好的答案:


如果需要询问,可能是您做错了。


这是有关堆栈分配的Win32详细信息:MSDN。


如果您认为自己可能受到堆栈空间的限制,那么几乎可以肯定会受到可用虚拟内存的限制,在这种情况下,您将需要找到其他解决方案。


您到底想做什么?


查看完整回答
反对 回复 2019-10-11
?
江户川乱折腾

TA贡献1851条经验 获得超5个赞

getrusage函数可获取当前用法。(请参见man getrusage)。


在getrlimitLinux中,将有助于获取与堆栈大小RLIMIT_STACK参数。


#include <sys/resource.h>

int main (void)

{

  struct rlimit limit;


  getrlimit (RLIMIT_STACK, &limit);

  printf ("\nStack Limit = %ld and %ld max\n", limit.rlim_cur, limit.rlim_max);

}

请看一下man getrlimit。相同信息可以按行ulimit -s或ulimit -a堆栈大小行获取。也看一下setrlimit可以设置限制的功能。但是,如其他答案中所述,如果您需要调整堆栈,那么您可能应该重新考虑您的设计。如果要一个大数组,为什么不从堆中取出内存呢?


查看完整回答
反对 回复 2019-10-11
?
慕村9548890

TA贡献1884条经验 获得超4个赞

将局部变量的地址从堆栈中取出将起作用。然后,在一个更嵌套的调用中,您可以减去另一个本地的地址,以找出它们之间的差异


size_t top_of_stack;


void Main()

{

  int x=0;

  top_of_stack = (size_t) &x;


  do_something_very_recursive(....)

}


size_t SizeOfStack()

{

  int x=0;

  return top_of_stack - (size_t) &x;

如果您的代码是多线程的,则需要处理每个线程的top_of_stack变量。


查看完整回答
反对 回复 2019-10-11
  • 3 回答
  • 0 关注
  • 781 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信