关于初始化大矢量的Segfault

时间:2012-11-29 18:36:24

标签: c segmentation-fault

  

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

3 个答案:

答案 0 :(得分:4)

可变长度数组通常分配在堆栈上。堆栈空间有限;你可能在这里得到一个堆栈溢出。你不能在这样的内存位置分配这么大的大小。您的数组太大,无法放入程序的堆栈中。分配这样大小的更好的想法是在堆上进行分配。

#include <stdlib.h>

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

/* some stuff */

free(end);

堆比堆栈大很多倍。

答案 1 :(得分:1)

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

如果必须分配非常大的值,请不要使用堆栈,而是将堆与malloc()一起使用。

答案 2 :(得分:1)

这可能是堆栈大小问题。

您可以使用setrlimitgetrlimit

手动检查和更改堆栈大小

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

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

 gcc --stack,<your size> ...