我在创建链表节点时使用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
字符串正确地复制到内部结构中。我确信这是一个简单的答案,但我找不到它。
答案 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;
这会将课程结构放在与课程名称相同的内存缓冲区中。