当前位置:  开发笔记 > 运维 > 正文

分段故障11,因为C中有40 MB的阵列

如何解决《分段故障11,因为C中有40MB的阵列》经验,为你挑选了1个好方法。

我正试图在我的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是否真的意识到我要求的不仅仅是"哦,为什么我会出现分段错误?"就像所有其他问题一样.)



1> C0deH4cker..:

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

您的程序崩溃,因为堆栈的大小比允许的大.这被称为堆栈溢出,通常在无限递归时出现.

堆栈的大小是实现定义的,因此Linux上的默认堆栈大小很可能大于OS X上的堆栈大小.


并非所有局部变量都在堆栈上分配.如果它被声明为`static`,它仍然是一个局部变量,但放在全局存储中.只定义一个全局变量(或称为本地`static`)没有问题.
推荐阅读
拾味湖
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有