0

可能重复:
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)
4

3 回答 3

4

变长数组通常分配在上。堆栈空间有限;您可能在这里遇到堆栈溢出。你不能在这样的内存位置分配一个非常大的大小。您的数组太大而无法放入程序的堆栈中。分配这种大小的一个更好的主意是在堆上分配。

#include <stdlib.h>

int *end = malloc(sizeof *end * max);

/* some stuff */

free(end);

堆比栈大很多倍。

于 2012-11-29T18:38:12.257 回答
1

您的堆栈大小受操作系统的限制。

如果您必须分配非常大的值,请不要使用堆栈,而是使用带有 malloc() 的堆。

于 2012-11-29T18:38:36.290 回答
1

这可能是堆栈大小问题。

setrlimit您可以手动检查和更改堆栈大小getrlimit

http://linux.die.net/man/2/setrlimit

您也可以在使用--stack选项编译时执行此操作:

 gcc --stack,<your size> ...
于 2012-11-29T18:40:38.767 回答