大数组声明的分段错误

我想用2mil声明一个unsigned long long数组。 元素。 当我第一次定义数组const的长度然后定义数组时,我得到一个分段错误错误。 但是当我将长度定义为unsigned long long时,声明起作用。

int main(int argc, const char *argv[]) { const unsigned long long lim = 2000000; //If I omit const, it works. unsigned long long nums2lim[lim]; exit(EXIT_SUCCESS); } 

有人知道为什么会抛出分段错误吗?

自动内存(在本地数组中使用)的限制远低于可分配内存。

你可以用它做几乎一样的(它使用指针)

 #include  int main(int argc, const char *argv[]) { unsigned long long lim = 2000000; unsigned long long *nums2lim=malloc(lim*sizeof(unsigned long long)); free(nums2lim); // don't forget this! return EXIT_SUCCESS; } 

我无法在我的SLES 10盒子上重现这种行为(gcc 4.1.2,是的,它是旧的)。 无论如何声明lim我都会遇到段错误。

我将在一个非常瘦的肢体上走自己的方式,方式,方式,并指出你对main的定义是不正确的; argv不应该被声明为const (标准要求argv数组指向的字符串应该是可修改的)。 这一点未定义的行为可能足以引起差异,但我严重怀疑它。

无论哪种方式,尝试在autoarrays(VLA或不是VLA)中分配200万个任何东西几乎总是糟糕的juju。 也许当计算机内存以TB为单位进行定期测量时,它将不再是一个问题,但是现在它将比通常准备处理的运行时堆栈更大。

你有几个选择。 一,您可以通过在文件范围(在任何函数之外)或使用static关键字声明它来声明具有static存储持续时间的数组。 注意这意味着你将无法使用lim变量来指定大小(即使你声明它为constlim也不是常量表达式 ;它的值在编译时是未知的):

 int main( int argc, char **argv ) { static unsigned long long nums2lim[2000000]; ... } 

或者,您可以在运行时从堆中分配它:

 int main( int argc, char **argv ) { const unsigned long long lim=2000000; int *nums2lim = malloc( sizeof *nums2lim * lim ); if ( nums2lim ) { ... } ... } 

您可以在C ++中执行此操作以在堆中分配数据:

 const unsigned long long lim = 2000000; unsigned long long *nums2lim = new unsigned long long[lim]; ... delete [] nums2lim;