如何处理C中的堆栈数组分配失败?

时间:2012-11-29 03:22:42

标签: c stack stack-overflow

如果我必须编写如下代码:

int a[10000000];

我知道由于堆栈溢出,代码有时可能会失败。问题是如何在运行时处理这些错误,并避免segfault?

2 个答案:

答案 0 :(得分:6)

通常,堆栈溢出异常很难以优雅的方式处理。这是因为堆栈已经溢出,并且为了运行更多代码(甚至异常处理代码),需要有可用的堆栈空间。

通常,程序员设计程序使它们不会溢出堆栈。这包括:

  • 将堆栈上分配的自动变量的大小保持在最小(如果需要大型数据结构,则使用其他类型的分配)
  • 避免不必要的递归,如果使用递归,确保对最大深度有合理的约束

如果在函数内需要1000万个整数空间,请不要在堆栈中分配它 - 使用malloc()new分配它(取决于您实际使用的是C还是C ++) 。当然,当你完成它时,free()delete也是你的责任。

如果您真的使用的是C ++ [1] ,那么您可能应该使用std::vector代替:

std::vector a(10000000);

底层标准库实现将在免费商店中分配空间,将在您的函数返回时自动为您解除分配。

[1]我希望人们不会仅仅因为拼写相似而对标记问题。

答案 1 :(得分:2)

在运行时无法处理此问题。在C中使用自动存储持续时间对象的唯一理智,安全的方法是保持它们足够小,以确保它们永远不会超过您知道的堆栈数量(例如,从不使用超过10%或所以你期望拥有的东西。)