2017-04-18 12 views
1

私はこの質問を複数の記事で見てきましたが、まだ私には分かりやすい説明があります。イムは、リンクされたリストを作成しようとしているが、構造体や関数がエラーを取得せずに呼び出すことはできませんポインタにキャストすることはできません。その本当に私を悩ます。どのようにこの権利を得るためにどのような助けをいただければ幸いですか?下のコードのいくつかは、問題を含んでいます。Typedef構造体をポインタにキャストすることはできません

typedef struct node 
{ 
    void *data; 
    struct node *next; 
} node; 

node *head = NULL; 

node* create(void *data, node *next) 
{ 
    node *new_node = (node*)malloc(sizeof(node)); 
    if(new_node == NULL) 
    { 
     exit(0); 
    }else{ 

     new_node->data = data; 
     new_node->next = next; 
     return new_node; 
    } 

} 

node* prepend(node *head, void *data) 
{ 
    node *new_node = create(data,head); 
    head = new_node; 
    return head; 
} 


void preload_adz(int adz_fd) 
{ 
    struct adz adz_info; 
    char adz_data[40]; 
    char adz_text[38]; 
    int adz_delay; 
    char adz_delayS[2]; 

    read(adz_fd,adz_data,40); 
    strncpy(adz_text,adz_data + 2,40-2); 
    sprintf(adz_delayS, "%c%c",adz_data[0],adz_data[1]); 
    adz_delay = atoi(adz_delayS); 

    adz_info.delay = adz_delay; 
    strncpy(adz_info.text,adz_text,38); 

    head = prepend(head, (void*)adz_info); //<---This line throws the error 

    while(read(adz_fd,adz_data,40) > 0) 
    { 

    } 
} 
+2

構造体をポインタとしてキャストすることはできません。あなたはそこで何を達成しようとしていますか? – kaylum

+0

リンクされたリストを開始しようとしていて、チュートリアルに従っていましたが、これはチュートリアルで行ったとおりです:/ http://www.zentut.com/c-tutorial/c-linked-list/#C_Linked_List_Program <チュートリアル – WizKiz

+1

'(void *)adz_info' - >'&adz_info'? – BLUEPIXY

答えて

2
struct adz adz_info; 

... 

head = prepend(head, (void*)adz_info); //<---This line throws the error 

ここでの問題はadz_infoであることは、スタック上の実際の構造体だ、ポインタではありません。関数にadz_infoを渡すとコピー構造体になります。

この構造体へのポインタが必要です。アドレスを取得するには&を使用してください。いったんポインタがあれば、それをvoidポインタにキャストする必要はなく、そのキャストは自動的です。

head = prepend(head, &adz_info); 

キャスティングは簿記のことです。 void *にキャストしても構造体がポインタにならず、コンパイラはこの変数の宣言された型を無視し、これがvoidポインタであると私に信じています。

+0

これはそれでした。 * facepalm * – WizKiz

+0

関数が返ったときにポインタがぶら下がってしまう –

+0

@WizKiz M.Mは、 'adz_info'がスタックに割り当てられているので、' preload_adz'が返ってくるとそのメモリは自動的にガベージコレクトされると思います。グローバルな 'head'に接続されているので、' head'は割り当てられていないメモリを指しています。 [dangling pointer](https://en.wikipedia.org/wiki/Dangling_pointer)。ヒープメモリ 'malloc'を使う必要があります。 – Schwern