2010-11-26 18 views
0

ねえ、
は、私はC言語で初心者だと基本的にはこのようになっていることを、私自身のリンクリストの実装を実装しようとした:C - リンクリストやポインタ問題

struct Element 
{ 
    void *value; 
    struct Element *next; 
}; 

typedef struct 
{ 
    struct Element *first; 
    struct Element *last; 
    unsigned int size; 
} LinkedList; 

void LinkedList_init(LinkedList *this) 
{ 
    this->size = 0; 
    this->first = NULL; 
    this->last = NULL; 
} 

void LinkedList_add(LinkedList *this, void *value) 
{ 
    struct Element *node = malloc(sizeof(struct Element)); 
    node->value = value; 
    node->next = NULL; 

    if (this->size == 0) 
     this->first = this->last = node; 
    else 
    { 
     this->last->next = node; 
     this->last = node; 
    } 

    this->size++; 
} 

だから、要するに、私が欲しいです任意の型を保持できるリンクリスト - 私は空ポインタを使ってCで可能であると聞いた。 私が値として構造で、たとえば、その実装を使用する場合、問題は今、生じ:

typedef struct 
{ 
    int baz; 
} Foo; 

int main(void) 
{ 
    LinkedList list; 
    Foo bar; 
    bar.baz = 10; 

    LinkedList_init(&list); 
    LinkedList_add(&list, (void *) &bar); 

    /* try to get the element, that was just added ... */ 
    Foo *firstElement = (Foo *)list.first; 
    /* ... and print its baz value */ 
    printf("%d\n", firstElement->baz); 

    return 0; 
} 

最後のprintfの呼び出しは、単にメモリアドレスのように見える-1077927056のような値を、出力します。だから、おそらくポインタの問題です。 Web上で似たような問題が発生したのを数日前に調べたところ、私は自分のロジックを捨てて、さまざまなランダム* &の組み合わせをテストしました。それはデッドエンドだった。 。:(

それはおそらくより多くの経験を積んだCプログラマのための単純なものですが、私はちょうど答えを見つけることができません助けてください:D

答えて

7

list.fiststruct Elementある

試してみてください。

Foo *firstElement = (Foo *)(list.first->value); 
+0

Argh、簡単です:D このことは本当に私を悩ませていました。 – Paran

+1

... '(Foo *)'へのキャストはもはや必要ありません。これが正しい軌道にあることを確認してください。 – caf