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

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

#include  int main(void) { int N = 590; double A[N][N]; double B[N][N]; double C[N][N]; printf("done"); } 
  • N设置为值<= 590:
    这运行没有错误,有或没有输出。
  • N设置为> 590的值:
    • 在删除输出线的情况下运行完美无缺。
    • 编译并运行输出: 分段错误

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

您尝试分配的内存多于堆栈上可用的内存,这会导致堆栈溢出 。 通常使用malloccallocrealloc动态分配大型数组会好得多。 当你完成它时,不要忘记通过免费调用释放这个内存:)

这些问题对您也有帮助:
C / C ++程序的最大堆栈大小
在C中创建数组时出现分段错误
使用变量启动数组时的分段错误

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

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