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
Argh、簡単です:D このことは本当に私を悩ませていました。 – Paran
... '(Foo *)'へのキャストはもはや必要ありません。これが正しい軌道にあることを確認してください。 – caf