あなたが上でクラッシュしている場合:
printf ("%s\n", kv->val_ptr);
それはkv
かkv->val_ptr
どちらかが「ユダヤ」何かを指していないことを安全な賭けです。
あなたLookup
コードは(もちろん、あなたが作成されたリンクリストのをめちゃくちゃにしていないと仮定した場合)無効なポインタを返す妨げるように見えるので、それはval_ptr
フィールドが正しく設定されていない可能性があります、またはそれはです文字列ではないものを指しています。
デバッガ(まともなものがない場合はprintf
行)を使用して、を調べてから、を使用することをお勧めします。根本的な原因を突き止めるのに大いに役立ちます。あなたがprintf
ルートを移動した場合
私は、次のようなコードを見ていることになる、(私は、デバッガを好むが、それは常にオプションではありません)、場所、あなた自身のif (kv)
行の前に:
if (kv) {
printf ("Starting DEBUG\n");
fflush (stdout); fsync (fileno (stdout));
printf ("kv as pointer is %p\n", kv);
fflush (stdout); fsync (fileno (stdout));
printf ("kv->val_ptr as pointer is %p\n", kv->val_ptr);
fflush (stdout); fsync (fileno (stdout));
printf ("kv->val_ptr as char[10] is %10.10s\n");
fflush (stdout); fsync (fileno (stdout));
printf ("Ending DEBUG\n");
fflush (stdout); fsync (fileno (stdout));
}
これは、コアダンプが出力を停止する前にフラッシュされるようにデバッグ文を書く方法を示しています。
基本的に、あなたは何をする必要があるかあなたがして、特定の行にそれを隔離余談として
:-)その行で間違っているものをうまくできるようになるまで、徐々に問題を絞り込むことで、空のリストがhead
がNULL
に設定されている場合、そのLookup
コードがクラッシュする可能性があります。実際にはprintf
行がクラッシュしていると言われているので、ここには該当しないでしょう。
良く1のようなものになります:
また
struct node* Lookup (int x) {
struct node *holder = head;
while (holder != NULL)
if (holder->key == x)
return holder;
return NULL;
}
、あなたが与えたリンクのコードに基づいて、あなたのヘッダファイルに関数プロトタイプを追加することもできます。 head
のような構造と変数がありますが、実装内でその関数内の関数の定義を正しく定義するためには、どのコードでも良い考えです。呼び出したい他の機能のためInsert
機能について
int Insert(int, char*, int);
、同:例として、それはのようなものが含まれている必要があります。
'kv-> val_ptr'の値は何ですか? – Barmar
デバッガでコードをステップ実行し、失敗したときの変数の値を確認します。 – Barmar
実際にいくつかの*関数プロトタイプ*をヘッダファイルに含めてみてください。今は 'main.c'がlinked_listを引っ張っています。hは構造体定義を含んでいますが、 'Insert'、' Lookup'などのプロトタイプは含みません。その結果、これらの関数は可変引数リストで 'int'を返す関数の暗黙の宣言を受け取ります。そして、あなたのビルド/実行リグ 'int'と' struct node * 'が同じサイズではないことに賭けています。したがって 'int Lookup()'は何かを返していますが、確かに有効なポインタではありません。あなたは、これについての警告の過多を受けているはずです、btw。 – WhozCraig