大数组声明的分段错误

时间:2015-05-04 15:43:46

标签: c arrays

我想用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);
}

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

3 个答案:

答案 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变量来指定大小(即使您声明它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 )
  {
    ...
  }
  ...
}

答案 2 :(得分:0)

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

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