我试图在 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/