可能的重复项:
C编程,为什么这个大数组声明会产生分段错误?
为什么这个程序会崩溃?它适用于最大 1e6 的良好状态,如果我没有将每个值设置为 0,则工作正常。
程序不会分配所有内存吗?
int main() {
const int max = 10000000; // 1e7
int end[max];
unsigned int i;
for ( i = 0; i < max; i++ )
end[i] = 0;
}
$ gcc test.c && ./a.out
Segmentation fault (core dumped)
可变长度数组通常在堆栈上分配。堆栈空间有限;您可能会在这里遇到堆栈溢出。您不能在这样的内存位置上分配非常大的大小。数组太大,无法放入程序的堆栈中。分配这种大小的更好主意是在堆上分配。
#include <stdlib.h>
int *end = malloc(sizeof *end * max);
/* some stuff */
free(end);
堆比堆栈大很多倍。
您的堆栈大小受操作系统的限制。
如果必须分配非常大的值,请不要使用堆栈,而是将堆与 malloc() 一起使用。
这可能是一个堆栈大小问题。
您可以使用setrlimit
和getrlimit
手动检查和更改堆栈大小
http://linux.die.net/man/2/setrlimit
您也可以在使用--stack
选项进行编译时执行此操作:
gcc --stack,<your size> ...