将字符串分配给struct中的指针 - 链接列表C.

时间:2018-02-20 18:10:37

标签: c linked-list c-strings

我正在尝试为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()应该释放程序中的指针,或者我可以释放节点? 谢谢!

2 个答案:

答案 0 :(得分:2)

item->name = strdup(name);

这样就可以了。如果您没有这个(strdup是一个POSIX事物)分配内存,然后使用strcpy / memcpy复制name指向的字符串。

不要隐藏typedef内部的指针,它更容易在大型代码库中维护 - 你总是要回头看看它是什么类型来编写正确的代码。

不要转换malloc的返回值并检查strdup的返回值,就像您对malloc所做的那样。使用freemalloc后,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*成员分配的任何缓冲区。