在 x86 Linux 系统上,某些情况可能会导致堆栈溢出:
struct my_big_object[HUGE_NUMBER]
在堆栈上。穿过它最终会导致SIGSEGV
。- 该
alloca()
例程(如malloc()
,但使用堆栈,自动释放自身,SIGSEGV
如果它太大也会爆炸)。更新: alloca() 并没有像我最初所说的那样被正式弃用;它只是气馁。
有没有办法以编程方式检测本地堆栈对于给定对象是否足够大?我知道堆栈大小可以通过 调整ulimit
,所以我希望有一种方法(但它可能是不可移植的)。理想情况下,我希望能够做这样的事情:
int min_stack_space_available = /* ??? */;
if (object_size < min_stack_space_available)
{
char *foo = alloca(object_size);
do_stuff(foo);
}
else
{
char *foo = malloc(object_size);
do_stuff(foo);
free(foo);
}