我正在尝试为C中的学生链接列表编写程序。 这是结构:
typedef struct student *studp;
typedef struct student{
int number;
char *name;
char *date;
unsigned grade;
studp next;
}stud;
现在我想编写一个创建新节点并为成员分配值的函数。 我不知道该怎么做,这是功能:
studp create_stud(int number, char *name, char *date, unsigned grade){
studp item = (studp)malloc(sizeof(stud));
if(!item){
printf("Cannot allocate memory\n");
exit(1);
}
item->number = number;
item->name = .....
return item;
} 我该如何将文本分配给会员姓名和日期?我可以使用运算符' =':
item->name = name;
或者我应该用malloc()分配内存? 如果我使用malloc()应该释放程序中的指针,或者我可以释放节点? 谢谢!
答案 0 :(得分:2)
item->name = strdup(name);
这样就可以了。如果您没有这个(strdup
是一个POSIX事物)分配内存,然后使用strcpy
/ memcpy
复制name
指向的字符串。
不要隐藏typedef
内部的指针,它更容易在大型代码库中维护 - 你总是要回头看看它是什么类型来编写正确的代码。
不要转换malloc
的返回值并检查strdup
的返回值,就像您对malloc
所做的那样。使用free
和malloc
后,strdup
分配了内存。
向您展示一个例子。 (插图)
stud* item = malloc(sizeof *item);
if(NULL == item){
perror("Cannot allocate memory\n");
exit(EXIT_FAILURE);
}
...
free(item->name);
free(item->date);
/* whatever you have allocated */
free(item);
编辑:如果strdup
不存在。
item->name = malloc(strlen(name)+1);
if(!item->name){
perror("malloc");
exit(EXIT_FAILURE);
}
memcpy(item->name, name, strlen(name)+1);
答案 1 :(得分:0)
您的结构包含char*
个成员。它们可以指向一个字符串,但它们不能包含一个字符串。为了复制这些字符串成员,您需要为新结构中的char*
字段分配缓冲区,然后为内容分配strncpy()
。
您有责任免费分配所有内存。可以把它想象成每个malloc
调用需要匹配的free
。我建议编写一个处理清理的相应delete_stud
函数。它可以释放与结构相关的内存,以及为char*
成员分配的任何缓冲区。