我做了一个链表,其节点包含4个字符串值。当我调用 newNode 函数时,出现一个错误,显示"Node 没有名为 familyName 的成员"以及其他成员。我的代码:
我对字符串在结构中的工作方式感到非常困惑。
您的直接问题是类型定义。您不能从那里调用malloc()
,您所能做的就是定义字段。内存分配必须稍后进行。所以,它应该是:
typedef struct node{
char *familyName;
char *firstName;
char *address;
char *phoneNumber;
struct node *link;
}Node;
一旦你解决了这个问题,你就会遇到另一个问题(运行时而不是编译时)。当您执行以下操作时:
p -> familyName = famName;
这只是将指针复制到您的结构中,并且指针始终是familyName
的内存位置 main()
.
这意味着每个节点都将指向相同的内存,并且您不断更新该内存。
您不会注意到代码的问题,因为您只要求一条记录。但是当您开始循环以获取更多记录时,这将成为一个问题。
最好的办法是使用 strdup()
之类的东西来复制传入的字符串,然后每个节点都有自己的字符串内存位置:
p -> familyName = strdup (famName);
(完成后不要忘记free()
每个字段的内存)。
万一您的 C 实现没有strdup()
,请参阅此处。
有几个问题:-
- 声明结构时不允许分配内存。要么,在
newNode()
方法中执行malloc
,要么像char familyName[50]
一样声明结构。 - 不应强制转换 malloc 的结果。
- 复制字符串时最好使用 strcpy(或 strdup)