C:用于链表节点的malloc(struct中的struct)

时间:2016-04-18 02:39:00

标签: c list struct malloc

我在创建链表节点时使用malloc动态分配内存时遇到了困难。

对于我的任务,我们必须使用以下结构定义:

typedef struct course {
    char *name;
    BST students;
} Course;

typedef struct courseNode {
    Course data;
    struct courseNode *next;
} *CourseList;

CourseList结构是实际的链表节点,而Course结构包含课程名称和注册学生的二叉搜索树。您会注意到结构Course位于结构CourseList内。

我需要创建一个新的CourseList节点,给定一个字符串作为内部Course结构的name字段,使用基于字符串长度的动态分配。我已经尝试了基于字符串长度mallocing外部和内部结构的所有组合,但我似乎无法将name字符串正确地复制到内部结构中。我确信这是一个简单的答案,但我找不到它。

2 个答案:

答案 0 :(得分:2)

  

我已经根据字符串的长度尝试了mallocing外部和内部结构的所有组合,但我似乎无法将名称字符串正确地复制到内部结构中。

这是因为字符串的长度不会改变您分配具有固定大小的struct的方式。字符串需要单独分配,并分配给name data CourseList成员的CourseList newNode = malloc(sizeof(*newNode)); newNode->data.name = malloc(strlen(name)+1); strcpy(newNode->data.name, name); 成员:

newNode

请注意CourseList前面的星号。这是因为{{1}}是指针类型。

答案 1 :(得分:0)

好吧,如果你真的想基于字符串长度malloc结构:

  /* Assuming newname is a const char * with the course name,
   * course_head is the start of the linked, list,
   * and students should be zero initialized */
  CourseList newNode = malloc(sizeof CourseList);
  Course newCourse = malloc(sozeof(Course) + strlen(newname) + 1);
  memset(newCourse->students, 0, sizeof(BST));
  newCourse->name = (char *)newCourse + sizeof(newCourse);
  strcpy(newCourse->name, newname);
  newNode->data = newCourse;
  newNode->next = course_head;
  course_head = newNode;

这会将课程结构放在与课程名称相同的内存缓冲区中。