2016-12-05 23 views
1

問題が発生しています。大きいデータを処理する必要があり、大きすぎる配列を作成すると、Segmentation fault (core dumped)が発生します。ここでは、問題の複製である:入れ子になっている配列が大きすぎると、セグメンテーションフォルト(コアダンプ)が発生する

int main() { 
struct { char a[2000][12] } b[2000]; 
return 0; } 

私はRAMの24ギガバイトを持っているので不思議ですArchlinux 64ビット、コンパイラなどcculimit -s戻り8192を使用しています。どのように問題を解決するか?私はそれがstackheapと関係があると思いますが、私はそれらが何であるか分かりません。

+2

It's Stack Overflow! –

+1

@KirillBulyginこのサイトは目的を達成したため、シャットダウンします。 – nicomp

+0

ヒープから割り当てる必要があります。スタックのサイズは通常1MB程度に制限されています。 malloc/freeを読んでください。 – OldProgrammer

答えて

1

基本的にスタックに2000 * 12 * 2000/1024 = 46875 KBを割り当てようとしていますが、8192 KBしか使用できません。迅速な修正はulimit -s 50000を設定することです。短い程度stackheap

:スタックは、各関数呼び出し(関数の変数の内容が存在する場所それは、その上すなわちスカラー値、アドレスやだ)のプライベートメモリであり、ヒープは、一般的にはあまり厳密でパブリックメモリであり、 (例えば、malloc(3)を参照)。

+0

プログラムの高速化:スタックサイズの増加や何らかの動的メモリ割り当ての実行 – ChiseledAbs

+0

速度に関しては、これらの方法は事実上同じですが、スタックに大きなメモリを割り当てることは間違っています。その理由の1つは、関数呼び出しが終了した後でメモリを偶発的に使用する可能性があります(メモリの内容が他のデータ)また、スタックサイズを拡張するために 'ulimit(1)'や 'ulimit(2)'を呼び出さなければならないからです(また、デスクトップ以外のいくつかのアーキテクチャでは大きなスタックを持つことは不可能です)。 –

1
ulimit -s 

合計RAMサイズが返されません。現在のシェルが持つ利用可能なスタックサイズ(およびそれが作成できるすべてのプロセス)だけを返します。したがって、使用可能なRAMサイズは重要ではありません。

ulimit -s unlimitedを使用して増やすことができます。しかし、私はそのような大規模な配列の代わりに、あなたの配列のサイズが〜48MBであり、 "スタック割り当て"の失敗を検出するのが難しいため、スタック上で利用できない場合は簡単に問題に遭遇することがあります。

1

ローカル変数を使用して配列を宣言することで、スタックメモリを使用しています。ヒープをメモリ割り当てで使用する:

typedef struct { 
    char a[2000][12]; 
} bigArray; 

int main(void) { 
    bigArray *array; 
    array = (bigArray*)malloc(2000 * sizeof(bigArray)); 

    // Do stuff with array here 

    free(array); 
    return 0; 
} 
関連する問題