我是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时,会发生分段错误。我想要的是检测可能的段错误并优雅地失败。如何知道哪些值会导致分段错误。而且,这是平台依赖的吗?
答案 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
投射到int
。 ust_limit
和arr_size
都应为size_t
类型(在<stddef.h>
中定义)。
示例:
unsigned long long numbs = malloc(arr_size * sizeof *numbs);
/* And later, when you're done with it */
free(numbs);