可能重复:
C programming, why does this large array declaration produce a segmentation fault?
为什么这个程序会崩溃?它适用于最大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)
答案 0 :(得分:4)
可变长度数组通常分配在堆栈上。堆栈空间有限;你可能在这里得到一个堆栈溢出。你不能在这样的内存位置分配这么大的大小。您的数组太大,无法放入程序的堆栈中。分配这样大小的更好的想法是在堆上进行分配。
#include <stdlib.h>
int *end = malloc(sizeof *end * max);
/* some stuff */
free(end);
堆比堆栈大很多倍。
答案 1 :(得分:1)
您的堆栈大小受操作系统的限制。
如果必须分配非常大的值,请不要使用堆栈,而是将堆与malloc()一起使用。
答案 2 :(得分:1)
这可能是堆栈大小问题。
您可以使用setrlimit
和getrlimit
http://linux.die.net/man/2/setrlimit
使用--stack
选项编译时也可以执行此操作:
gcc --stack,<your size> ...