我正试图在我的Mac上用C编写代码,然后遇到了Segmentation Fault: 11
.我把问题定位double
为500万个元素数组的声明.例如,以下代码给出了Segmentation Fault
:
int main(){ double vals[5000000]; return 0; }
我的第一个问题是,是8*5000000 bytes
= 40 MB
太大了?我也尝试在另一台运行顺利的机器上运行它.那么第二个问题是,什么决定了应用程序可用的内存?它是否与机器上的可用RAM有关(我的mac有16 GB
,linux机器有62 GB
)?或者它与编译器选项有关(我gcc
在两台机器上使用没有任何选项,但不同的版本).
编辑:好的,所以我已经将测试代码更改为以下内容,因为在实际代码中变量未使用:
#include#include int main(){ double vals[5000000]; vals[0] = 500; printf("%lf\n",vals[0]); return 0; }
另外,我编译没有任何选项/优化:gcc test.c
.
(我也想知道这个downvoter是否真的意识到我要求的不仅仅是"哦,为什么我会出现分段错误?"就像所有其他问题一样.)
因为您将其创建为自动变量,所以它将进入堆栈.堆栈大小不是很大.一般的经验法则是对于任何大于几KB的对象,总是使用malloc()
(或C++的新增功能)在堆上动态分配它们.
您的程序崩溃,因为堆栈的大小比允许的大.这被称为堆栈溢出,通常在无限递归时出现.
堆栈的大小是实现定义的,因此Linux上的默认堆栈大小很可能大于OS X上的堆栈大小.