C语言 初始化大向量时的隔离错误



可能的重复项:
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() 一起使用。

这可能是一个堆栈大小问题。

您可以使用setrlimitgetrlimit手动检查和更改堆栈大小

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

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

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

相关内容

  • 没有找到相关文章

最新更新