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

标签 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 设置为 <= 590 的值:
    这运行没有错误,有或没有输出。
  • N 设置为大于 590 的值:
    • 在移除输出行的情况下完美运行。
    • 编译运行,输出:segmentation fault

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

最佳答案

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

关于C:数组初始化段错误取决于大小和对 printf() 的调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10983084/

相关文章:

c - 在 UNIX 中使用 C 列出环境变量

c - 我在将整数数组传递到服务器端时遇到问题

Javascript数组推送

c - cudaMemcpy2D 的段错误

c++ - 将调用推送到 STL 队列 <std::string> 会在从套接字读取字符串时导致段错误

c - 为什么 for 循环中的 Push 函数在每次迭代中被多次调用,而不是每次迭代只调用一次?

c - 在定义中将#a 字符串化,为什么不好

arrays - 如何在 Go 中不使用 for 循环来初始化数组?

c - 为什么 GDB 不显示导致段错误的函数地址

c - 嵌套循环、内循环并行化、重用线程