大数组在C中给出分段错误

时间:2011-10-06 18:34:09

标签: c arrays segmentation-fault

我是C的新手,所以如果这是一个绝对的初学者问题,我很抱歉,但是当我构建大型数组时,我遇到了分段错误,我正在做的相关内容是:

unsigned long long ust_limit;
unsigned long long arr_size;

/* ust_limit gets value around here ... */

arr_size = ((ust_limit + 1) / 2) - 1;
unsigned long long numbs[(int)arr_size];

这适用于ust_limit的某些值,但是当它超过大约4.000.000时,会发生分段错误。我想要的是检测可能的段错误并优雅地失败。如何知道哪些值会导致分段错误。而且,这是平台依赖的吗?

4 个答案:

答案 0 :(得分:5)

您最有可能获得堆栈溢出,因为您在堆栈上创建了一个非常大的数组。为避免这种情况,请动态分配内存:

unsigned long long *numbs = malloc(arr_size * sizeof(unsigned long long));

稍后,当你完成数组后,再次释放它:

free(numbs);

答案 1 :(得分:1)

堆栈框架上的数组存储(对其大小有限制),请改为使用malloc

unsigned long long *numbs = malloc(arr_size * sizeof(long long));
// don't forget to free after use
free(numbs)

答案 2 :(得分:1)

你消耗了太多的筹码。限制取决于平台。

确切的限制取决于操作系统。某些操作系统可以在一定程度上改变这些限制。

对于大量内存,您应该使用malloc和/或calloc(和free)头部。

答案 3 :(得分:1)

numbs是可变长度数组(VLA)。

只能在块范围内(即在函数内部)创建VLA。它们像任何其他局部变量一样被分配,通常在堆栈上。

不幸的是,该语言没有提供检测或处理局部变量分配失败的方法。如果你分配了太多内存,如果你很幸运,你的程序会崩溃

编译时大小未知的大对象应通过malloc()分配(这意味着您需要跟踪分配并使用free()释放它们。)

顺便说一句,没有必要将arr_size投射到intust_limitarr_size都应为size_t类型(在<stddef.h>中定义)。

示例:

unsigned long long numbs = malloc(arr_size * sizeof *numbs);
/* And later, when you're done with it */
free(numbs);