5

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

double sample[200000][2];

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

double sample[20000][2]

有用!!这些索引值有限制吗?

4

2 回答 2

9

看起来您尝试为200,000 x 2 = 400,000double 值保留空间,每个值double是 8 个字节,因此您尝试保留大约3.2 MB

即使您的机器可能有几个 Gigs 的内存,堆栈空间也受到每个进程和每个线程的限制,并且很可能限制为 1 或 2 兆字节。所以你不能分配 3 兆,你崩溃了。

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

要使用 malloc:

double (*sample) [200000];
s = malloc(sizeof(*sample) * 2); 
sample[0][0] = 0.0;
sample[1][199999] = 9.9;
于 2013-11-04T22:51:05.107 回答
6

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

例如,Visual Studio中的堆栈大小默认为1MB但可以修改。这里有一个更完整的典型堆栈大小列表:

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

如果您有大量数据,则在堆栈上分配的另一种方法是通过malloc使用动态分配C FAQ如何动态分配多维数组有很好的参考?,将他们的二维示例修改为double

#include <stdlib.h>

double **array1 = malloc(nrows * sizeof(double *));
for(i = 0; i < nrows; i++)
   array1[i] = malloc(ncolumns * sizeof(double));
于 2013-11-04T22:46:22.787 回答