大数组在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_sizeintust_limitarr_size都应该是size_t类型(在定义)。

例:

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