如何在C语言中处理堆栈数组分配失败?

3

如果我需要编写以下代码:

int a[10000000];

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


2
将其分配到自由存储器上。 - chris
1
预防胜于治疗 :) 不要在堆栈上分配数组,直接使用自由存储区。 - Sergey Kalinichenko
为什么你要编写像下面(即上面)这样的代码? - Nik Bougalis
2个回答

6
一般来说,堆栈溢出异常非常难以优雅地处理。这是因为堆栈已经溢出,为了运行更多的代码(甚至是异常处理代码),需要有可用的堆栈空间。
通常,程序员会设计程序,使其无法溢出堆栈。这包括:
- 将分配在堆栈上的自动变量的大小最小化(如果需要大型数据结构,则使用其他类型的分配) - 避免不必要的递归,并且如果使用递归,则确保对最大深度有合理限制
如果你需要在函数内部为一千万个整数预留空间,不要在堆栈上进行分配 - 使用malloc()或new进行分配(取决于你实际使用的是C还是C++)。当然,你也有责任在完成后使用free()或delete释放它。
如果你真的在使用C++[1],那么你应该使用std::vector代替:
std::vector a(10000000);

基础标准库实现将在自由存储器上分配空间,并在函数返回时自动释放它。请勿同时使用标记问题,因为它们的拼写相似。

1
脚注值得一提。C和C++是不同的语言,具有不同的目标和哲学,一个语言的真理并不一定适用于另一个语言。这就像将问题标记为Java和C#一样。 - John Bode
我删除了C++标签,尽管我认为C++中也有堆栈的概念,这与C中的堆栈没有区别。 - Moeb
1
@Moeb:实际上,ISO C标准从未提到过“stack”这个词。具有自动存储期的对象按照先进后出的方式分配和释放,但是机制并没有由语言指定。 - Keith Thompson

2

在运行时无法处理这个问题。在C语言中,使用自动存储期对象的唯一明智、安全的方法是保持它们足够小,以便您可以确信它们永远不会超出您知道的堆栈量(例如,从不使用超过您预期拥有的堆栈量的10%左右)。


一个程序如何找出最大的堆栈空间? - Moeb
1
除非你在开发嵌入式系统,否则它至少要达到100K左右,所以请尽量少使用,这样就不会有问题。关于使用栈的最佳经验法则是经典名言“如果你不确定,那么你肯定用不起”。 - R.. GitHub STOP HELPING ICE

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接