2016-08-10 18 views
1

以下は、リンク先リストにノードを追加するためのポインタへのポインタを使用しようとしている簡単なコードです。ポインタへのポインタ:参照するメンバのエラー

#include <stdio.h> 
#include <malloc.h> 

struct node 
{ 
     int data; 
     struct node *next; 
}; 

void insert(struct node **root) 
{ 
    struct node * temp = (struct node *)malloc(sizeof(struct node)); 
    if(*root == NULL) 
    { 
     *(root) = (struct node *) malloc (sizeof(struct node)); 
     *(root)->data = 5; 
     *(root)->next = temp; 
    } 
    else 
     printf("here"); 
} 

int main() 
{ 
    struct node *root = NULL; 
    insert(&root); 
    return 0; 
} 

私の理解では、main()ではブロックがrootに割り当てられています。 insertには、そのメモリブロックのアドレスが引数に渡されます。次に、そのアドレスの構造体に割り当てられたメモリブロックがあるかどうかをチェックし、NULLの場合は構造体ブロックにメモリを割り当てます。

error: request for member 'data' in something not a structure or union 

私は正確に間違ったつもりかを理解することはできませんよ。そして、これは私が上記のコードを実行したときに、私は次のエラーを取得する*root .Butによって参照されなければなりません。

+3

'*(ルート) - >データ= 5;' - >> '(*ルート) - >データ= 5;'ところで:あなたのコードいくつかのコードパスで '* temp'メモリをリークします。そして:キャストを取り除く、彼らは唯一の害を行うことができます。 – wildplasser

+0

それは働いた!お気軽に@wildplasser。 2つのケースで優先順位がどのように異なるかについて簡単に説明してください。 –

+0

他は既にそれをしています。 ' - >'と '.'が最も優先順位が高くなります(" bind tighter ")。 '*'は*弱い*。 '#include ' malloc.hは非標準ヘッダです。 'stdlib.h'が必要です – wildplasser

答えて

3

->は、逆参照演算子(*)よりも厳密にバインドします。 operator precedenceを参照してください。だから、

*(root)->data = 5; 

は同等です:あなたがすることを目的何

*(root->data) = 5; 

た:あるべき次の行、ため

(*root)->data = 5; 

同じ:

(*root)->next = temp; 

また、malloc.hはporではありません表。 malloc()のプロトタイプを取得する代わりに、C標準ヘッダstdlib.h>を含める必要があります。

1

->演算子は、逆参照演算子*よりも高い優先順位を持ちます。完全なリストについては、hereを参照してください。 だから、

*(root)->data = 5; 

ような行が最初として、rootによって指さ何かにフィールドdataを見つけようとしている、と明らかにそれは同様にポインタ型であるとして、それを見つけることができません、違法になります。

代わりに、明示的な優先使用する必要があります。

(*root)->data = 5; 
関連する問題