Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
解释为什么在C语言中分配大数组会导致分段错误_C_Arrays_Memory Management - Fatal编程技术网

解释为什么在C语言中分配大数组会导致分段错误

解释为什么在C语言中分配大数组会导致分段错误,c,arrays,memory-management,C,Arrays,Memory Management,我对C语言不是很有经验,但最近我一直在用这种语言编写一些程序来提高它的速度(它最初是用python编写的)。我真的没有问题了,因为我已经设法解决了我原来的问题。然而,我想知道为什么这个解决方案有效 我有一个表示复数的数据结构,定义为 typedef struct _fcomplex { float re, im; } fcomplex; 然后我想创建一个复数数组,如下所示: fcomplex M[N]; 这里N是一个大数字(大约10^6)。然后在一个函数中用零初始化数组,该函数基本上遍历所有

我对C语言不是很有经验,但最近我一直在用这种语言编写一些程序来提高它的速度(它最初是用python编写的)。我真的没有问题了,因为我已经设法解决了我原来的问题。然而,我想知道为什么这个解决方案有效

我有一个表示复数的数据结构,定义为

typedef struct _fcomplex { float re, im; } fcomplex;
然后我想创建一个复数数组,如下所示:

fcomplex M[N];
这里N是一个大数字(大约10^6)。然后在一个函数中用零初始化数组,该函数基本上遍历所有索引并设置数组中的值。有点像:

fcomplex num = {0.0, 0.0};
int i;
for (i=0 ; i < N ; i++) {
   M[i] = num;
}
然后像以前一样执行所有操作,代码工作正常。另外,对于较小的N值,无论哪种方式,代码都可以正常运行


正如我所说,使用malloc()已经解决了这个问题,但我想知道为什么?

这取决于您在哪里分配了阵列。如果它在一个函数中,那么变量在堆栈上分配,默认情况下,(我假设您运行的是linux),堆栈大小是8Mb

您可以使用
ulimit-s
找到它,还可以修改此值,例如
ulimit-s 1000000

您可能想看看这些问题:

  • (由@Ed建议)

因为堆栈内存有限(假设在函数中声明了大数组),而声明大数组会导致堆栈溢出。当您使用
malloc
动态定位内存时,数组被分配到比堆栈大得多的堆上。对于大型数组,您最好使用操作系统内存分配函数。在我的Linux机器上,堆栈限制通常为800万字节,而不是8千字节。您是对的,我的意思是8192,但是主页上说这个单位实际上是1024字节。为了更加准确,我在main()函数中分配了数组,然后将指向数组的指针作为参数传递给函数。不过谢谢你。
fcomplex* M = malloc(N*sizeof(fcomplex));