c - 由于 C 中的 40 MB 数组而导致段错误 11

标签 c

我试图在 Mac 上用 C 编写一些代码,但遇到了段错误:11。我发现问题出在 500 万个元素的 double 数组的声明上。例如,以下代码给出了段错误:

int main(){
    double vals[5000000];
    return 0;
}

我的第一个问题是,8*5000000 字节 = 40 MB 太大了吗?我也尝试在另一台机器(linux)上运行这个,运行顺利。那么第二个问题是,什么决定了应用程序可用的内存?这是否与机器上的可用 RAM 有关(我的 mac 有 16 GB,linux 机器有 62 GB)?或者它与编译器选项有关(我在两台机器上使用 gcc 没有任何选项,但版本不同)。

编辑:好的,所以我将测试代码更改为以下内容,因为在实际代码中未使用该变量:

#include <stdlib.h>
#include <stdio.h>

int main(){
   double vals[5000000];
   vals[0] = 500;

   printf("%lf\n",vals[0]);

   return 0;
}

此外,我在没有任何选项/优化的情况下进行编译:gcc test.c

(我还想知道投反对票的人是否真的意识到我问的不仅仅是“哦,为什么我会遇到段错误?”就像所有其他问题一样。)

最佳答案

因为您将其创建为自动变量,所以它将进入堆栈。堆栈大小不是很大。一般经验法则是,对于任何大于几 KB 的对象,始终使用 malloc() (或 C++ 的 new)在堆上动态分配它们。

您的程序正在崩溃,因为堆栈的大小超出了允许的大小。这称为堆栈溢出,通常在无限制递归时出现。

堆栈的大小是由实现定义的,因此 Linux 上的默认堆栈大小很可能比 OS X 上的更大。

关于c - 由于 C 中的 40 MB 数组而导致段错误 11,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34247623/

相关文章:

python - 对 C 和 Python 中的缓冲和无缓冲 stdout/stderr 感到困惑

c - 如何在C中检测未初始化的字符串

c - 为什么我们可以读取这个分配的指针中的任何字符而不写入它?

c - 实模式 OS 中的 16 位 .com C 程序

c - 使用 C 对函数和结构进行编程,得到奇怪的输出,没有错误

c - 我如何告诉 C 程序创建 n 个数组,通过 scanf 读取 n?

c - 套接字描述符是否唯一?

c - Linux 中的段错误

c - 队列陷入循环

c++ - C/C++ 64位数组操作