解释为什么分配大数组会导致 C 中的分段错误
Explanation of why allocating a large array results in segmentation fault in C
我在 C 语言方面经验不足,但我最近一直在用该语言编写一些程序以加快速度(它最初是用 python 编写的)。我真的不再有问题了,因为我已经设法解决了我原来的问题。但是,我想知道为什么这个解决方案有效。
我有一个表示复数的数据结构定义为
typedef struct _fcomplex { float re, im; } fcomplex;
然后我想创建一个复数数组:
fcomplex M[N];
这里的 N 是一个很大的数字(大约 ~10^6)。然后我在一个函数中用零初始化数组,该函数基本上 运行s 通过所有索引并设置数组中的值。它是这样的:
fcomplex num = {0.0, 0.0};
int i;
for (i=0 ; i < N ; i++) {
M[i] = num;
}
但是,当我 运行 代码时,它会导致分段错误。但是,如果我使用 malloc() 为数组分配 space 而不是
fcomplex* M = malloc(N*sizeof(fcomplex));
然后像以前一样做所有事情,代码工作正常。此外,对于较小的 N 值,代码 运行 都可以。
正如我所说,使用 malloc() 已经解决了问题,但我想知道为什么?
这取决于你分配数组的位置。如果它在函数内部,则变量分配在堆栈上,默认情况下,(我假设您是 运行 linux)堆栈大小为 8Mb。
可以用ulimit -s
查出来,也可以修改这个值,比如ulimit -s 1000000
.
你可能想看看这些问题:
- Memory allocation for global and local variables
- Segmentation fault on large array sizes(@Ed 建议)
我在 C 语言方面经验不足,但我最近一直在用该语言编写一些程序以加快速度(它最初是用 python 编写的)。我真的不再有问题了,因为我已经设法解决了我原来的问题。但是,我想知道为什么这个解决方案有效。
我有一个表示复数的数据结构定义为
typedef struct _fcomplex { float re, im; } fcomplex;
然后我想创建一个复数数组:
fcomplex M[N];
这里的 N 是一个很大的数字(大约 ~10^6)。然后我在一个函数中用零初始化数组,该函数基本上 运行s 通过所有索引并设置数组中的值。它是这样的:
fcomplex num = {0.0, 0.0};
int i;
for (i=0 ; i < N ; i++) {
M[i] = num;
}
但是,当我 运行 代码时,它会导致分段错误。但是,如果我使用 malloc() 为数组分配 space 而不是
fcomplex* M = malloc(N*sizeof(fcomplex));
然后像以前一样做所有事情,代码工作正常。此外,对于较小的 N 值,代码 运行 都可以。
正如我所说,使用 malloc() 已经解决了问题,但我想知道为什么?
这取决于你分配数组的位置。如果它在函数内部,则变量分配在堆栈上,默认情况下,(我假设您是 运行 linux)堆栈大小为 8Mb。
可以用ulimit -s
查出来,也可以修改这个值,比如ulimit -s 1000000
.
你可能想看看这些问题:
- Memory allocation for global and local variables
- Segmentation fault on large array sizes(@Ed 建议)