2016-09-08 9 views
-2

完全なコードを使用して印刷後、*構造体のノードを渡そうとしたときにセグメンテーション違反を取得しておくと:正確になぜこれが起こっているが、printf関数がアクセスしようとしたとき、それはライン43で起こるhttps://gist.github.com/IamSlightly/5debd2373231a62c0a44665902e9ca7f私はここのprintf

わかりません戻り値

struct node* kv = Lookup (13); 
if (kv) 
    printf ("%s\n", kv->val_ptr); 

struct node* Lookup(int x){ 
    struct node *holder; 
    holder = head; 
    while ((holder->key!=x) && (holder->next!=NULL)){ 
    holder = holder->next; 
    } 
    if (holder->key==x) { 
    printf("\nlets try this shit again\n"); 
    return holder; 
    } else { 
    printf("\n*** %d is not in the linked_list ***\n", x); 
    return NULL; 
    } 
} 
+1

'kv-> val_ptr'の値は何ですか? – Barmar

+1

デバッガでコードをステップ実行し、失敗したときの変数の値を確認します。 – Barmar

+0

実際にいくつかの*関数プロトタイプ*をヘッダファイルに含めてみてください。今は 'main.c'がlinked_listを引っ張っています。hは構造体定義を含んでいますが、 'Insert'、' Lookup'などのプロトタイプは含みません。その結果、これらの関数は可変引数リストで 'int'を返す関数の暗黙の宣言を受け取ります。そして、あなたのビルド/実行リグ 'int'と' struct node * 'が同じサイズではないことに賭けています。したがって 'int Lookup()'は何かを返していますが、確かに有効なポインタではありません。あなたは、これについての警告の過多を受けているはずです、btw。 – WhozCraig

答えて

2

あなたが上でクラッシュしている場合:

printf ("%s\n", kv->val_ptr); 

それはkvkv->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)); 
} 

これは、コアダンプが出力を停止する前にフラッシュされるようにデバッグ文を書く方法を示しています。

基本的に、あなたは何をする必要があるかあなたがして、特定の行にそれを隔離余談として


:-)その行で間違っているものをうまくできるようになるまで、徐々に問題を絞り込むことで、空のリストがheadNULLに設定されている場合、その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); 

、同:例として、それはのようなものが含まれている必要があります。

+0

ありがとうございました。ポインタとして – plzhelpme

+0

開始DEBUG ホルダーが0x7f9e3a80c000 holder-> val_ptrあるポインタが0x7f9e3a80c200 セグメンテーションフォールトであるとして:11ただ、お奨めこの – plzhelpme

+0

@plzhelpmeをどうするかfigureout、その後、あなたの問題は、文字列として 'val_ptr'を処理しているということですそうではありません。それは、それが完全に終了することを保証するのと同じくらい簡単かもしれませんし、他の場所で引き起こされるメモリ破損ほど複雑かもしれません。しかし、デバッグのアプローチは、最終的にあなたを答えに導くものです。 – paxdiablo