在我的C程序中,当我尝试分配这个数组的值时:
double sample[200000][2];
我遇到了段错误。但是当我使用以下命令时:
double sample[20000][2]
它可以工作!!这些索引值有限制吗?
看起来你试图为200,000 x 2 = 400,000
个双精度值预留空间,每个double
占用8个字节,因此你试图预留约3.2兆字节。
尽管你的计算机可能有几个G的内存,但每个进程和线程的堆栈空间都是有限制的,可能被限制在1或2兆字节。所以你不能分配3兆字节,否则会崩溃。
要解决这个问题,你需要改用动态内存,使用malloc
函数。
这将让你从堆空间中分配内存,而堆空间比栈空间更加充足。
使用malloc的方法如下:
double (*sample) [200000];
s = malloc(sizeof(*sample) * 2);
sample[0][0] = 0.0;
sample[1][199999] = 9.9;
1MB
,但可修改。这里有一个更完整的典型堆栈大小列表here:SunOS/Solaris 8172K bytes
Linux 8172K bytes
Windows 1024K bytes
cygwin 2048K bytes
#include <stdlib.h>
double **array1 = malloc(nrows * sizeof(double *));
for(i = 0; i < nrows; i++)
array1[i] = malloc(ncolumns * sizeof(double));
*
)。现在已经修复。 - abelenky200000
的double类型将在自动存储中,而较小的第二维将是动态的,这绝对不是最初的意图。 - Shafik Yaghmoursample
是一个指向包含200,000个双精度浮点数的数组的指针。malloc(sizeof(*sample)*2)
请求动态分配这两个数组,总共有400,000个双精度浮点数。 - Zan Lynx