2016-12-14 6 views
-2

次のように私は私がtmp->next->nextにアクセスすることができない理由このようにリンクされたリストのポインタにアクセスできないのはなぜですか?

typedef struct slinkedlist { 
    int data; 
    struct slinedlist *next; 
} node; 

は、私は、私のコードで一時ポインタnode * tmpを持っている、ノードを宣言しました。

/*コードを追加しました*/

typedef struct slinkedlist { 
     int data; 
     struct slinedlist *next; 
    } node; 


    node *start; 

/* Assume I have 5 nodes in a list */ 

    void ex(void) 
    { 
     node *tmp; 

     tmp = start->next->next; /* This will be error in C , explain me, why? */ 

     /* But this works fine */ 
     tmp = start->next; 
     tmp = tmp->next; 
    } 

私は次のスタート - >ネクスト>にアクセスした場合、私はエラーになりますなぜですか?

+3

試してみるとどうなりますか?エラーメッセージが表示されますか?何? –

+1

この方法では、ヌルポインタ逆参照の危険があります。 – werediver

+0

構造体用ではなくポインタのメモリを割り当てました –

答えて

1

tmpが最後のノードを指すとすぐに、tmp-> nextはヌルになり、tmp-> next-> nextはヌルポインタ逆参照を引き起こします。

+0

私の質問にコードを追加しました。 –

+0

を確認してください。エラーによって、セグメンテーションフォルトを意味するのですか?いずれにしても、tmp = start-> next-> nextのどちらでも可能です。 tmp = start-> next; tmp = tmp-> next;論理的には同じですが、私が考えることができる最後の説明は1つだけです。コンパイラは前者を最適化して、第1および第2逆参照の間の順序外実行になります。 –

+0

実際に問題があるかどうかを確認する方法の1つは、生成されたアセンブリコードを調べることです。前者が連続している逆参照になった場合、順序が狂って実行されるとsegaultが発生します。その場合、それはコンパイラのバグです。 –

関連する問題