在 C 中创建大型数组

Har*_*ris 5 c arrays

我的问题与C语言有关。我必须创建一个大约 200 万个元素的大数组,但计算机给出了“分段错误(核心转储)”错误。我简单地说:

int integer_array[2000000];
float float_array[2000000];
Run Code Online (Sandbox Code Playgroud)

我确信这与分配给数组的内存有关,但我无法找出正确的解决方案。

rur*_*ban 6

通常你需要在堆上动态创建这样一个数组。

int *integer_array = (int*)malloc(2000000 * sizeof(int));
float *float_array = (float*)malloc(2000000 * sizeof(float));
Run Code Online (Sandbox Code Playgroud)

对于堆栈分配,数组可能太大,例如,如果不是全局使用,而是在函数内部使用。

int main () {
    int a[200000000]; /* => SEGV */
    a[0]=0;
}
Run Code Online (Sandbox Code Playgroud)

最简单的解决方法,将数组移到外面:

int a[200000000];
int main () {
    a[0]=0;
}
Run Code Online (Sandbox Code Playgroud)

您也可以将其声明为静态:

int main () {
    static int a[200000000];
    a[0]=0;
}
Run Code Online (Sandbox Code Playgroud)

请注意,堆栈大小取决于系统。可以使用 ulimit 更改它。

  • 所有演员都很糟糕。无需强制转换 malloc() 的返回值。此外,更强大的替代方法是使用 sizeof 对象而不是 sizeof(type)。最后 nit,integer_array 的名字很糟糕。它不是数组,sizeof(integer_array) 不会返回 2000000 * sizeof(int)。int *integer_array = (int*)malloc(2000000 * sizeof(int)); int *ip = malloc(2000000 * sizeof *ip) 在 C 中更惯用。 (3认同)
  • “ malloc 需要强制转换,这是 C。”你是个有趣的人,@rurban。或巨魔,很难说。;) 无论如何,评论不言自明。TTFH (3认同)
  • @BjornA。你在胡说八道。你所有的论点都是错误的。 (2认同)
  • 真的吗?我认为不是,但可以随意_争论_。告诉我我错在哪里。但请记住,所讨论的语言是 C,而不是 C++。 (2认同)
  • 我说你所有的论点都是错误的。malloc 需要强制转换,这是 C。 sizeof(type) 是优越的。integer_array 被正确命名。int integer_array = (int)malloc(2000000 * sizeof(int)); 是胡说八道。int *ip 不是这里的问题。 (2认同)