1

TDS.c、TDS.h、ExtraRoutines.cの3つのファイルがあり、これらは共有ライブラリとして一緒にコンパイルされています。TDS.hはヘッダーファイルであり、変数を定義します。ExtraRoutines.cはメモリ割り当てを担当し、TDS.cがメインの仕事を実行します。変数x0はTDS.hでとして定義されdouble* x0、メモリはExtraRoutines.cで次のように割り当てられます。

x0 = malloc(10 * sizeof(*x0));

TDS.cの最初の行で、ExtraRoutines.cを呼び出してメモリを割り当てます。メモリ割り当ては通常どおり実行され、関数は戻ります。gdbを使用してプログラムをデバッグすると、問題が発生します。print x0[0]データにアクセスするために使用すると、次のように表示されます。

Cannot access memory at address 0x0

これは、それがであることを意味しx0ますNULL。ただし、次のコマンドを使用してのデータをファイルに保存するx0と、正しい値が保存されます。これは、が存在し、有効なメモリアドレスを参照していることを意味します。NULLx0x0

FILE* fh = fopen("dump", "w");
for(k = 0; k < 10; k++)
{
    x0[k] = orgX0[k];
    fprintf(fh, "%f\n", x0[k]);
}
fclose(fh);

プログラムにバグがあり、データを分析してバグを見つける必要があります。現在gdb、グローバル変数は表示されていないため、バグを見つけるのは非常に困難です。したがって、問題を見つけて、グローバル変数(x0を含む)の値をgdbに表示するのに役立つことを感謝します。ありがとう

4

0 に答える 0