3

別の学生が、自分のCコードの何が問題になっているのかと私に尋ねました。私は誤った動作をうまく再現しましたが、なぜこのセグフォールトが発生するのかまったくわかりません。この小さなCプログラムを考えてみましょう。

#include <stdio.h>

int main(void) {
    int N = 590;
    double A[N][N];
    double B[N][N];
    double C[N][N];
    printf("done");
}
  • N値<=590に設定:
    これは、出力の有無にかかわらず、エラーなしで実行されます。
  • N> 590の値に 設定:
    • 出力ラインを削除して問題なく動作します。
    • コンパイルして出力で実行:セグメンテーション違反

これの理由は何ですか?誰か説明できますか?

4

3 に答える 3

2

アプリで使用できるスタックの量はシステムに大きく依存し、自動変数(double配列など)はスタックスペースを消費します。関数を呼び出すには、追加のスタックスペースが必要です(その変数、および保存されたレジスタやリターンポイントなどのハウスキーピング用)。スタックの最後から離れて、アクセスが禁止されているメモリにアクセスしようとしています。

于 2012-06-11T15:32:24.457 に答える
1

スタックで使用可能なメモリよりも多くのメモリを割り当てようとすると、スタックオーバーフローが発生します。通常、、、またはを使用してmalloc、そのような巨大な配列を動的に割り当てる方がはるかに優れています。あなたがそれを終えたときに呼び出すことによってこのメモリを解放することを忘れないでください:)callocreallocfree

これらの質問も役に立ちます。変数を使用して配列を開始する場合のCセグメンテーション違反での配列作成時
のプログラムセグメンテーション違反のC/C++最大スタックサイズ

于 2012-06-11T15:32:22.223 に答える
0

スタックオーバーフローが発生しています。printfただし、VC ++を使用する場合と使用しない場合の両方で、ここで再現できます。私の推測では、引数をprintfスタックにプッシュする操作により、エラーが明らかになります。パラメータをとらない関数を呼び出した場合でも、それは起こりますか?

于 2012-06-11T15:32:29.693 に答える