2017-01-10 15 views
-3

C(可変長配列)でリストを作成できるプログラムを作成しようとしていますが、コンパイル時に「互換性のないポインタ型からの代入」エラーが発生します。リストプログラムの互換性のないポインタ型からの代入

エラーは、これらのライン上にある:

list_item *last = l->first; 
last = last->next; 
last->next = item; 

コード:あなたは1-かどうかを確認する必要がありadd_to_listで

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

typedef struct{ 
    list_item *first; 
    unsigned int len; 
} list; 

list *new_list(){ 
    list *l = (list *) malloc(sizeof(list)); 
    l->first = NULL; 
    l->len = 0; 
    return l; 
} 

list_item *new_list_item(){ 
    list_item *item = (list_item *) malloc(sizeof(list_item)); 
    item->next = NULL; 
    item->data = NULL; 
    return item; 
} 

void add_to_list(list *l, void *data){ 
    if(l == NULL || data == NULL){ 
     return; 
    } 

    list_item *item = new_list_item(); 
    item->data = data; 

    int i; 
    list_item *last = l->first; 
    for(i = 0; i < l->len; i++){ 
     last = last->next; 
    } 

    last->next = item; 
    l->len++; 
} 
+2

とはどこですか? –

+3

['malloc()'と 'C 'のファミリの戻り値をキャストしない理由についてのこのディスカッションを参照してください。](http://stackoverflow.com/q/605845/2173917)。 –

+1

'struct list_item * next;' ...どのように?そこに 'struct list_item'はありません... –

答えて

-1

あなたが参照するエラーは、このによって引き起こされている:

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

これは、匿名の構造(ないlist_itemという名前の1)を作成し、その匿名の構造にtypedefさ名前list_itemを与えています。自己参照が必要な場合は、次の操作を行う必要があります。

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

他にも言及していないエラーがあります。たとえば、あなたはNULLポインタ間接参照しようとしている:

list_item *last = l->first; 
for(i = 0; i < l->len; i++){ 
    last = last->next; 
} 

あなたがリストに何かを追加初めて、l->firstlastがNULLでl->lenはとてもループが実行されない0であることを意味NULLです。次に、あなたは:

NULLポインタを逆参照し、アプリケーションをクラッシュさせます。

あなたはその問題を解決すると仮定すると、あなたは、このループの中で、次のいずれかをヒットします:このループが行われ

for(i = 0; i < l->len; i++){ 
    last = last->next; 
} 

した後、最後は再びNULLになります。そしてlast->next = itemが実行され、再度セグメンテーションが発生します。あなたは実際に次のポインタを正しく割り当てることができるように1つを短く止める必要があります。

あなたが交換する場合:

int i; 
list_item *last = l->first; 
for(i = 0; i < l->len; i++){ 
    last = last->next; 
} 

をして:

if (! l->first) { 
    l->first = item; 
} else { 
    unsigned int i; 
    list_item *last = l->first; 
    for (i = 0; i < l->len-1; i++) { 
     last = last->next; 
    } 
    last->next = item; 
} 

その後、物事はより良い動作します。

+0

から表示することができるかもしれません。なぜ誰かが答えをあきらめる必要性を感じたのかが分かりました。 – jszakmeister

0

まず>最初のヌルである(リストが空である)後でTRので、 last-> nextにアクセスすると偽りましたが、この場合lastはnullでした。

add_to_list(L、(void *型)4)の場合:あなたが何かを追加したい場合は、

EX型キャストを行う必要がありますので

また、機能add_to_listはデータとして*のみ無効受け入れ数字または

add_to_list(l、(void *)struct something);

+0

あなたのコードを試しましたが、私はまだ同じエラーがあります –

+1

'add_to_list(l、(void *)4)'のようなものを提唱しないでください。これはメモリ上の位置4へのポインタを作成しています。データポインタをデータへのポインタではなく実際のデータを格納する場所として使用しようとすると、実際にはうっかりしています。 sizeof(pointer)がsizeof(data)を保持するのに十分な大きさかどうかという問題もあります。長い、長い、長い、または長い倍のデータがあると考えてください。ポインタの格納領域が十分ではなく、キャストがその事実を隠しているため、データを失う可能性がある状況はたくさんあります。 – jszakmeister

+0

実際のエラーをエラーリストまたはデバッガ – Lorand

関連する問題