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
と、正しい値が保存されます。これは、が存在し、有効なメモリアドレスを参照していることを意味します。NULL
x0
x0
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に表示するのに役立つことを感謝します。ありがとう