【问题标题】:Assigning a pointer to next node in the list分配指向列表中下一个节点的指针
【发布时间】:2018-12-30 16:13:46
【问题描述】:

我已经建立了一个名为 User 的结构。

因为我使用的User是几个数据结构,这个结构只存储了关于用户的数据

typedef struct{
    long id;
    char *name;
    char *surname;
    int age;
    char gender;
    char *username;
    char *password;
    char *description;
    char *hobbies;
}User; 

现在我想为女性创建一个链接列表,所以我创建了

typedef struct{
    User *userWoman;
    struct Women *next;
}Women;

现在,当我尝试将指针分配给下一个指针时:

void push(Women **head,User *woman){
    if((*head)->next == NULL){
        (*head) -> userWoman = woman;
    }
    else{
        Women *newWoman = malloc(sizeof(Women));
        if (newWoman == NULL){
            printf("Allocation of newWoman failed\n");
            exit(1);
        }
        newWoman -> userWoman = woman;
        (*head)->next = newWoman;
    }
}

我收到错误:不兼容的指针类型从 'Women *' 分配给 'struct Women *'

接下来我该如何申报?它必须是女性类型

【问题讨论】:

  • 你有一个类型别名Women(在结构之后定义),但你没有一个类型struct Women。想想你如何定义结构没有typedef
  • @Someprogrammerdude 我不应该使用 struct 来创建指向我当前正在防御的结构的指针吗?
  • typedef struct Women { User *userWoman; struct Women *next; }Women;

标签: c pointers linked-list


【解决方案1】:

您只需一步即可定义结构和别名。当然,这是合法的,但在解析结构的成员时,类型别名是未知的。所以类型别名Women 在解析成员时是未知的。编写Women *next 时可能会遇到编译器错误;并且struct Women *next 此时不会导致编译器错误,而是将其视为不完整类型的前向声明。

为结构命名并使用它来声明这种类型的成员:

typedef struct WomenStruct {
    User *userWoman;
    struct WomenStruct *next;
} Women;

以后Women*struct WomenStruct*会是同义词,和你写的完全一样……

struct WomenStruct {
    User *userWoman;
    struct WomenStruct *next;
};
typedef struct WomenStruct Women;  // let "Women" be an alias for "struct WomenStruct"

【讨论】:

  • 为什么要使用 2 个不同的名称而不是 typedef struct Women { User *userWoman; struct Women *next; } Women;
  • @bruno:使用同名当然是合法的;使用不同的只是个人意见/习惯。
  • @StephanLechner 那么 struct WomenStruct 有什么作用呢?使用typedef的结构名称到底是不是(女)?
猜你喜欢
  • 1970-01-01
  • 2014-12-13
  • 1970-01-01
  • 1970-01-01
  • 2021-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-19
相关资源
最近更新 更多