1

基本的に私がやろうとしているのは、ノードを使用してノード内に任意のデータ型を配置できる汎用リストを作成するvoid*ことです。これは一般的なリストであり、その中に入れたい構造です。

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

struct person {
    char *name; 
    int age;
};

ポインタを割り当てる機能です

LIST *create_node(void *data, int size) {
    LIST *tmp;
    tmp = NULL;
    tmp = (LIST*)malloc(sizeof(LIST));
    tmp->data = malloc(size);
    tmp->data = data;
    memcpy(tmp->data, data, sizeof(data));
    tmp->next = NULL;
    return tmp;
}

これは私が関数を呼び出すcreate_node関数です

void test_list() {
     LIST *my_list;
     struct person *my_person;
     my_list = NULL;

     my_person = (struct person*)malloc(sizeof(struct person));
     strcpy(my_person->name, "PABLO");
     my_person->age = 23;
     my_list = create_node(my_person, sizeof(struct person));
     printf("%d \n", my_list->data->age);
}

問題は、「構造または列挙型ではないものでのメンバーの年齢の請願」というエラーが発生する最後の行にあります。どうすればこの問題を取り除くことができますか?

4

2 に答える 2

3

として宣言dataしましたvoid *。本当に を指していることが確実にわかっている場合はperson、次のようにキャストする必要があります。

((struct person *)my_list->data)->age
于 2013-01-17T18:27:03.753 に答える
0

少し異なる方法で行うことがいくつかありますが、ここでの具体的なエラーは次の式にあります。

my_list->data->age

my_list->dataLIST 型の宣言から、 の型が であることを思い出してくださいvoid *。 これが実際に -- を指していることはわかっていますが、これら 2 つの関数は別の時点でコンパイルされた別のファイルにある可能性があるため、コンパイラはこれを認識していません。void *struct person

したがって、これを型キャストを使用するvoid *ものとして扱う必要があることをコンパイラに明示的に伝える必要があります。struct person *

((struct person *)my_list->data)->age
于 2013-01-17T18:41:12.180 に答える