2016-03-20 19 views
0
typedef struct A A; 
typedef struct A* AList; 


struct A{ 
    char* name; 
    AList *next; 
}; 

AList create(char *name) 
{ 
    AList new = (AList)malloc(sizeof(AList)); 
    new->name = name; 
    new->next = NULL; 
    return new; 
} 

void add(char* name, AList *aList) 
{ 
    AList list = *aList; 
    if (list == NULL) 
    { 
     list = create(name); 
     *aList = list; 
    } 
    else 
    { 
     while (list->next != NULL) 
      list = list->next; 
     list->next = create(name); 
    } 
} 

こんにちは!これは私が困っているコードです。すべて正常に動作しますが、コードの最後の2行では "incomaptible pointer typeからの割り当て"しか得られません。理由はわかりません。ポインタが互換性のある型に変更された場合(私の意見では、list = * list-> next;)、セグメンテーション違反が発生します。これをどうすれば解決できますか?助けを おかげで、 ムコCのリンクリスト/ポインタ

+1

私はあなたの 'AList'型エイリアスのようなポインタ型のエイリアスを作成することをお勧めしません。なぜなら、それがポインタであることを忘れてしまい、誤ってあなたのように'next'構造体メンバでやるか、または間違ったサイズを割り当てることです。 –

+0

ポインタを 'typedef'エイリアスに隠さないようにしてください。あなたの' create'関数が間違っています。あなたは 'A *'である 'AList'のためのスペースを割り当てますが、' struct A'のためのスペースを割り当てるべきです。 – Holt

+0

私はコードの純真ではありませんが、このように見栄えが良くないのですか?そして、私はAのメモリを割り当てるべきですが、A *を返すべきです。 AList new =(AList)malloc(sizeof(A)); ? – Muco

答えて

0

この

struct A{ 
    char* name; 
    AList next; 
}; 

機能createの戻り値の型がA*として定義されてAList、あるこの

struct A{ 
    char* name; 
    AList *next; 
}; 

変更。しかしA::nextのタイプはAList*です。これはA**です。互換性のないタイプがあります。