C 尝试声明大数组时出现分段错误和核心转储

C 尝试声明大数组时出现分段错误和核心转储,c,arrays,C,Arrays,在我的C程序中,当我尝试分配此数组值时: double sample[200000][2]; 我得到一个分段错误。但当我使用: double sample[20000][2] 它起作用了!!这些索引值有限制吗?您可能会溢出堆栈,因为在大多数现代实现中,这是一个自动变量,它们将分配到大小有限的堆栈上 例如,中的堆栈大小默认为1MB,但可以修改。有一个更完整的典型堆栈大小列表: 如果您有大量数据,那么在堆栈上进行分配的另一种方法是通过使用动态分配。C FAQ提供了一个很好的参考,将二维示例修改为

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

double sample[200000][2];
我得到一个分段错误。但当我使用:

double sample[20000][2]

它起作用了!!这些索引值有限制吗?

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

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

如果您有大量数据,那么在堆栈上进行分配的另一种方法是通过使用动态分配。C FAQ提供了一个很好的参考,将二维示例修改为double:

#包括
双**阵列1=malloc(nrows*sizeof(双*);
对于(i=0;i
看起来您试图为
200000 x 2=400000
双值保留空间,每个
double
是8个字节,因此您尝试保留大约3.2 MB的空间

即使您的机器可能有几gig的内存,但每个进程和每个线程的堆栈空间都是有限的,很可能限制在1或2兆字节。所以你不能分配3兆,你会崩溃

要解决此问题,您需要使用更改为动态内存。
这将允许您从比堆栈空间多得多的堆空间进行分配

要使用malloc:

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

还有一些堆栈注释:一些系统具有“无限”的堆栈大小,因为它会根据需要增长。但是,当添加线程时,堆栈突然具有固定的大小,因为每个堆栈都需要一个唯一的位置,并且会很快运行到相邻的内存分配中。如何修改堆栈大小?我在这里使用gcc编译器。@james什么操作系统?Linux堆栈信息:@DanielKamilKozar:我认为标准没有定义最小大小。例如,一台16位计算机,您将被限制为64KB的对象。然而,这曾经是一个常见的C编程环境。@ZanLynx:你说得有点对,我忘记了一个间接层次(
*
)。现在已修复。我必须同意@ZanLynx我不知道您的分配代码是如何工作的。我用我试用过的代码示例编辑了您的代码示例。@ZanLynx这仍然是错误的,因此,
200000
double*将自动存储,更小的二维空间将是动态的,这绝对不是最初的意图。@ShafikYaghmour:自动存储?否。在上面的代码
示例中
是一个指向200000个双精度数组的指针。
malloc(sizeof(*sample)*2)
请求动态分配其中两个阵列,总共400000个。
#include <stdlib.h>

double **array1 = malloc(nrows * sizeof(double *));
for(i = 0; i < nrows; i++)
   array1[i] = malloc(ncolumns * sizeof(double));
double (*sample) [200000];
s = malloc(sizeof(*sample) * 2); 
sample[0][0] = 0.0;
sample[1][199999] = 9.9;