【发布时间】:2015-09-01 01:57:14
【问题描述】:
我对 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;
}
但是,当我运行代码时,会导致分段错误。但是,如果我使用 malloc() 为数组分配空间而不是
fcomplex* M = malloc(N*sizeof(fcomplex));
然后像以前一样做所有事情,代码工作正常。此外,对于较小的 N 值,无论哪种方式,代码都能正常运行。
正如我所说,使用 malloc() 已经解决了问题,但我想知道为什么?
【问题讨论】:
-
因为堆栈在内存中是有限的(假设您在函数中声明了大数组)并且声明大数组会导致堆栈溢出。当您使用
malloc动态分配内存时,数组分配在比堆栈大得多的堆上。 -
对于大型数组,最好使用操作系统内存分配函数。
标签: c arrays memory-management