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