1

私は小さなCプログラムを持っています。でコンパイルするとgcc、すべて正常に動作しますが、実行しようとすると、次のメッセージが表示されます。

Segmentation fault (core dumped)

gdb andブレークポイントを配置しmain()てプログラムを開始したときにデバッグしようとしましたが、次のメッセージが表示されgdbます:

行番号情報を持たない関数 main を終了するまでのシングル ステップ。

プログラム受信信号 SIGSEGV、セグメンテーション違反。

0x00007ffff7a56ad4 in ?? () /lib/x86_64-linux-gnu/libc.so.6 から

そして、これは私の mani() 関数のまさに始まりです:

int main(int argc, char **argv) {

   long N;
   double *A, *B, *C, t;

   srand(time(NULL));

   N = atoi(argv[1]);
   A = (double *) malloc(N * N * sizeof(double));
   B = (double *) malloc(N * N * sizeof(double));
   C = (double *) malloc(N * N * sizeof(double));
   matFillSimple(N, A, 1.0);
   matFillSimple(N, B, 2.0);
   matFillSimple(N, C, 0.0);
...
4

1 に答える 1

2

Nの型がの戻り値と一致することを確認する必要がありatoi()ます。暗黙的な型変換に依存しないようにしてください。これにより、値が予期しないものに変換されるという問題が発生する可能性があります。

すべての警告 ( gcc -Wall) を付けてコンパイルすると、おそらくこの影響に対する警告が表示されるはずです。ドキュメント にリストされている、 GCC でオンにできるその他の警告があります。警告付きでコンパイルするのは良い習慣です。

さらに、ポインターを処理するときにエラー チェックを行う (良い) 習慣を身に付けてください。各呼び出しの後、メモリが正常に割り当てられているかどうかを必ず確認してください。

言い換えると:

A = (double *) malloc(N * N * sizeof(double));
...

次のようにする必要があります。

double *A = NULL;
A = malloc(N * N * sizeof(double));
if (!A) {
    fprintf(stderr, "ERROR: Could not allocate space for A\n");
    return EXIT_FAILURE;
}
...

doubleポインタごとに繰り返します。

私の疑いでは、 の値Nが非常に大きい (N * Nさらに大きい) ため、 を実行する前にシステムのメモリが不足している可能性がありますmatFillSimple()。これは、その可能性のトラブルシューティングに役立ちます。

于 2013-11-02T00:16:24.693 に答える