0

重複の可能性:
C プログラミング、この大きな配列宣言がセグメンテーション違反を引き起こすのはなぜですか?

このプログラムがクラッシュするのはなぜですか? 最大 1e6 で問題なく動作し、すべての値を 0 に設定しなければ問題なく動作します。

プログラムは割り当てられたすべてのメモリを取得しませんか?

int main() {
    const int max = 10000000; // 1e7
    int end[max];
    unsigned int i;
    for ( i = 0; i < max; i++ )
        end[i] = 0;
}


$ gcc test.c && ./a.out 
Segmentation fault (core dumped)
4

3 に答える 3

4

可変長配列は通常、スタックに割り当てられます。スタック スペースは限られています。おそらくここでスタックオーバーフローが発生しています。そのようなメモリ位置にそのような非常に大きなサイズを割り当てることはできません。配列が大きすぎて、プログラムのスタックに収まりません。このようなサイズを割り当てるより良いアイデアは、ヒープに割り当てることです。

#include <stdlib.h>

int *end = malloc(sizeof *end * max);

/* some stuff */

free(end);

ヒープは、スタックの何倍も大きくなります。

于 2012-11-29T18:38:12.257 に答える
1

おそらくスタックサイズの問題です。

setrlimitとを使用して、スタックサイズを手動で確認および変更できますgetrlimit

http://linux.die.net/man/2/setrlimit

--stackオプションを使用してコンパイルするときにも実行できます。

 gcc --stack,<your size> ...
于 2012-11-29T18:40:38.767 に答える
1

スタック サイズはオペレーティング システムによって制限されます。

非常に大きな値を割り当てる必要がある場合は、スタックを使用せず、malloc() でヒープを使用します。

于 2012-11-29T18:38:36.290 に答える