3

另一个学生问我他的 C 代码有什么问题。我成功地重现了错误行为,完全不知道为什么会出现这种段错误。考虑这个微型 C 程序:

#include <stdio.h>

int main(void) {
    int N = 590;
    double A[N][N];
    double B[N][N];
    double C[N][N];
    printf("done");
}
  • 设置N为 <= 590 的值:
    运行时不会出现错误,无论有无输出。
  • 设置N为 > 590 的值:
    • 删除输出线后运行完美。
    • 编译并运行输出:分段错误

这是什么原因?谁能解释一下?

4

3 回答 3

2

您的应用程序可用的堆栈数量非常依赖于系统,并且自动变量(例如您的双数组)会占用堆栈空间。调用函数需要额外的堆栈空间(用于其变量,以及诸如保存的寄存器和返回点之类的内务管理)。您正在离开堆栈的末尾并尝试访问您被禁止访问的内存。

于 2012-06-11T15:32:24.457 回答
1

您尝试分配比堆栈上可用的内存更多的内存,这会导致堆栈溢出malloc通常使用,calloc或动态分配像这样的巨大数组要好得多reallocfree当你完成它时,不要忘记通过调用来释放这个内存:)

这些问题也会对您有所帮助:
C/C++ 程序的最大堆栈大小
Segmentation Fault on create an array in C
Segmentation Fault When Using Variable To Initiate Array

于 2012-06-11T15:32:22.223 回答
0

你得到一个堆栈溢出。但是,无论是否printf使用 VC++,我都可以在这里重现它。我最好的猜测是,将参数推送到printf堆栈上的操作会导致错误出现。如果你调用一个不带参数的函数,它仍然会发生吗?

于 2012-06-11T15:32:29.693 回答