2

重複の可能性:
大きな配列サイズでのセグメンテーション違反

プログラムを実行すると、セグメンテーション違反が発生します。

#include<iostream>
using namespace std;

int main(){
    int x[2000][2000];
    int y;
    cin >> y;
}

ただし、次の 2 つのプログラムを実行すると問題ありません。

#include<iostream>
using namespace std;

int x[2000][2000];
int main(){

    int y;
    cin >> y;
}

#include<iostream>
using namespace std;

int main(){
    int x[2000][2000];
    int y;
}

私はかなり混乱しています。誰でも理由を教えてもらえますか?

4

2 に答える 2

9

おめでとうございます。スタック オーバーフローが見つかりました。

最初の例では、大きな配列がスタックの最後を超えてxプッシュyされるため、それにアクセスするとプログラムがクラッシュします。(2)宣言した大​​きな配列がデータセグメントにあり、スタックにないため、クラッシュしません。(3) スタックの最後を超えてメモリに実際にアクセスしていないため、クラッシュしません (宣言はしていますが、読み書きしていません)。

于 2012-06-10T14:30:08.023 に答える
2

最初の例では、スタックに 20,000*20,000*4 バイト (32 ビット整数を想定) を割り当てようとしています。これは約 16MB のデータになり、コンパイラによって割り当てられたスタック サイズ (通常は約 1MB) を超えるため、(スタック) メモリが不足します。

2 番目の例では、コンパイラは、メモリxを保持するのに十分なスペースがある別のグローバル スペース (スタック上ではない) にメモリを割り当てます。

3 番目の例は、1 番目と同じ状況になるように見えるため、よりトリッキーですが、関数で意味のある作業が行われていないと見なしたため、コンパイラが関数を最適化する可能性があります (したがって、関数のメモリ割り当てはありません)。ローカル変数)

于 2012-06-10T14:30:47.527 に答える