尝试声明一个大数组时,分段错误和核心转储

时间:2013-11-04 22:44:39

标签: c arrays

在我的 C 程序中,当我尝试分配此数组值时:

double sample[200000][2];

我收到了分段错误错误。但是当我使用:

double sample[20000][2]

它有效!!这些指数值是否有限制?

2 个答案:

答案 0 :(得分:7)

您似乎尝试为200,000 x 2 = 400,000双值保留空间,每个double为8个字节,因此您尝试保留 3.2兆字节

即使您的计算机可能有几个Gig内存,但每个进程和每个线程的堆栈空间有限,并且可能限制为1或2兆字节。所以你不能分配3兆,然后崩溃。

要解决此问题,您需要使用malloc更改为动态内存 这将让你从堆空间分配,这比堆栈空间更丰富。

使用malloc:

double (*sample) [200000];
s = malloc(sizeof(*sample) * 2); 
sample[0][0] = 0.0;
sample[1][199999] = 9.9;

答案 1 :(得分:6)

你可能会溢出你的堆栈,因为在大多数现代实现中它是一个自动变量,它们将分配在有限大小的堆栈上。

例如,visual studio中的堆栈大小默认为1MB,但可以修改。有一个更完整的典型堆栈大小列表here

SunOS/Solaris   8172K bytes
Linux           8172K bytes
Windows         1024K bytes
cygwin          2048K bytes

如果您拥有大量数据,则在堆栈上分配的替代方法是通过malloc使用动态分配 C FAQ How can I dynamically allocate a multidimensional array?有一个很好的参考,修改了 double 的二维示例:

#include <stdlib.h>

double **array1 = malloc(nrows * sizeof(double *));
for(i = 0; i < nrows; i++)
   array1[i] = malloc(ncolumns * sizeof(double));