大数组声明的分段错误
我想用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
数组指向的字符串应该是可修改的)。 这一点未定义的行为可能足以引起差异,但我严重怀疑它。
无论哪种方式,尝试在auto
arrays(VLA或不是VLA)中分配200万个任何东西几乎总是糟糕的juju。 也许当计算机内存以TB为单位进行定期测量时,它将不再是一个问题,但是现在它将比通常准备处理的运行时堆栈更大。
你有几个选择。 一,您可以通过在文件范围(在任何函数之外)或使用static
关键字声明它来声明具有static
存储持续时间的数组。 注意这意味着你将无法使用lim
变量来指定大小(即使你声明它为const
, lim
也不是常量表达式 ;它的值在编译时是未知的):
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;