2016-08-29 9 views
0

私はCプログラムを書いた。関数内でのコードの一部は次のようになります。CでNULLへのポインタへのポインタを初期化して宣言できないのはなぜですか?

struct node* functionName(struct node *currentFirstPointer){ 
    struct node **head = NULL; 
    *head = currentFirstPointer; 
    return *head; 
} 
ここ

nodeが構造体です。しかし、この行は私がプログラムを実行するとき私にsegmentation faultを与えます。しかし、私が宣言し、ポインタのポインタを別の文の中で以下のような同じ関数の中で初期化すると、うまくいきます。

struct node* functionName(struct node *currentFirstPointer){ 
    struct node **head; 
    *head = NULL; 
    *head = currentFirstPointer; 
    return *head; 
} 

第1ブロックが機能せず、第2ブロックが正常に動作する理由は何ですか?

+1

あなたは[___MCVE___](http://stackoverflow.com/help/mcve)の作成を気にしますか? –

+2

第1の例は正常に動作し、第2の例は正常に動作していますか?それは意味をなさないからです。あなたは他の方法を意味していないのですか?最初の例でseg faultが発生している場合、問題はポストされたコードにありません。 – Lundin

+0

私はそれがあなたのケースでは未定義の動作だと理解していますが、これをVisual Studioで再現できないため、どのコンパイラを使用しているか教えてください。 –

答えて

2

ポインタを間接参照する2つの例があります。

struct node **head = NULL; 
*head = currentFirstPointer; 

struct node **head; 
*head = NULL; 
*head = currentFirstPointer; 

の両方が未定義の動作の原因です。最初はNULLポインタの参照を外しています。 2番目の方法では、初期化されていないポインタを逆参照しています。

第2ブロックはで動作するように見えるかもしれませんが、これは未定義の動作の問題です。

ポインタを逆参照する前に、headのメモリを最初に割り当てる必要があります。

struct node **head = malloc(sizeof(*head)*SOME_COUNT); 
*head = currentFirstPointer; 
+1

OPは、第2の例が動作し、第1の例が動作しないと主張する。 – Lundin

+0

@ Lundin、私は2番目のブロックさえ未定義の動作の原因だと言っています。動作するように見えるかもしれませんが、未定義の動作です。 –

+1

それはなぜ第1のものがseg障害を与えるのか説明しません。質問は不明であり、さらに明確化することなく答えられない。 – Lundin

関連する問題