C:数组初始化段错误取决于大小并调用printf()

时间:2012-06-11 15:25:26

标签: c arrays segmentation-fault printf

另一位学生问我他的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设置为值&lt; = 590:
    无论是否输出,都可以正常运行。
  • N设置为值&gt; 590:
    • 在删除输出行的情况下运行完美无缺。
    • 使用输出编译并运行:分段错误

这是什么原因?有人可以解释一下吗?

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

您尝试分配的内存超过堆栈上可用的内存,导致堆栈溢出。通常使用malloccallocrealloc动态分配大型数组会更好。完成后,请不要忘记通过调用free来释放此内存:)

这些问题对您也有帮助:
C/C++ maximum stack size of program
Segmentation Fault on creating an array in C
Segmentation Fault When Using Variable To Initiate Array

答案 2 :(得分:0)

你的堆栈溢出。但是我可以使用和不使用VC ++的printf来重现它。我最好的猜测是,将参数推送到堆栈上的printf会导致错误显现出来。如果你调用一个不带参数的函数,它仍然会发生吗?