大数组在C中给出了分段错误
我是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时会发生分段错误。 我想要的是检测可能的段错误并优雅地失败。 如何知道哪些值会导致分段错误。 而且,这是平台依赖的吗?
您最有可能获得堆栈溢出,因为您在堆栈上创建了一个非常大的数组。 要避免这种情况,请动态分配内存:
unsigned long long *numbs = malloc(arr_size * sizeof(unsigned long long));
稍后,当您完成数组后,再次释放它:
free(numbs);
您在堆栈框架上的数组存储,其大小有限,请使用malloc
。
unsigned long long *numbs = malloc(arr_size * sizeof(long long)); // don't forget to free after use free(numbs)
你消耗了太多的筹码。 限制取决于平台。
确切的限制取决于操作系统。 在某些操作系统上,这些限制可以在某种程度上改变。
对于大量内存,你应该使用带有malloc
和/或calloc
(和free
)的头。
numbs
是可变长度数组(VLA)。
可以仅在块范围内(即,在函数内部)创建VLA。 它们像任何其他局部变量一样被分配,通常在堆栈上。
不幸的是,该语言没有提供检测或处理局部变量的分配失败的方法。 如果你分配了太多的内存, 如果你很幸运你的程序会崩溃。
在编译时大小未知的大对象应该通过malloc()
分配(这意味着你需要跟踪分配并用free()
释放它们)。
顺便说一句,没有必要将arr_size
为int
。 ust_limit
和arr_size
都应该是size_t
类型(在
定义)。
例:
unsigned long long numbs = malloc(arr_size * sizeof *numbs); /* And later, when you're done with it */ free(numbs);