首页 文章

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

提问于
浏览
0

我正在尝试为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 回答

  • 2
    item->name = strdup(name);
    

    这样就可以了 . 如果你没有这个( strdup 是POSIX的东西)分配内存然后使用 strcpy / memcpy 来复制 name 指向的字符串 .

    不要在 typedef 里面隐藏指针's easier to maintain in large codebase - you always have to look back to get what it'的类型是写正确的代码 .

    不要强制转换 malloc 的返回值并检查 strdup 的返回值,就像对 malloc 所做的那样 . 此外 free 使用 mallocstrdup 分配的内存 .

    给你举个例子 . (插图)

    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);
    
  • 0

    您的结构包含 char* 成员 . 它们可以指向一个字符串,但它们不能包含字符串 . 为了复制这些字符串成员,您需要为新结构中的 char* 字段分配缓冲区,然后在内容上分配 strncpy() .

    释放您分配的所有内存是您的责任 . 可以把它想象成每个 malloc 调用都需要匹配 free . 我建议编写一个处理清理的相应 delete_stud 函数 . 它可以释放与结构相关的内存,以及为 char* 成员分配的任何缓冲区 .

相关问题