我想用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);
}
有人知道为什么会抛出分段错误吗?
答案 0 :(得分:3)
自动内存(在本地数组中使用)的限制远低于可分配内存。
你可以用它做几乎相同的(它使用指针)
#include <stdlib.h>
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;
}
答案 1 :(得分:1)
我无法在我的SLES 10盒子上重现这种行为(gcc 4.1.2,是的,它是旧的)。无论lim
如何声明,我都会遇到段错误。
我会在一个非常瘦弱的肢体上走,路,方式,方式,并指出你对main
的定义是不正确的;不应将argv
声明为const
(标准要求argv
数组指向的字符串应该是可修改的)。那些未定义的行为可能足以引起差异,但我对此表示怀疑。
无论哪种方式,尝试在auto
数组(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 )
{
...
}
...
}
答案 2 :(得分:0)
您可以在C ++中执行此操作以在堆中分配数据:
const unsigned long long lim = 2000000;
unsigned long long *nums2lim = new unsigned long long[lim];
...
delete [] nums2lim;