在创建链表节点时,我很难使用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
字符串正确复制到内部结构中。我相信有一个简单的答案,但我找不到。
我已经尝试过根据字符串的长度对外部结构和内部结构进行mallocing的所有组合,但似乎无法将名称字符串正确复制到内部结构中。
这是因为字符串的长度不会改变分配固定大小的struct
的方式。字符串需要单独分配,并分配给CourseList
的data
的name
成员:
CourseList newNode = malloc(sizeof(*newNode));
newNode->data.name = malloc(strlen(name)+1);
strcpy(newNode->data.name, name);
注意newNode
前面的星号。这是因为CourseList
是指针类型。
如果你真的想根据字符串长度对结构进行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;
这将课程结构放置在与课程名称相同的内存缓冲区中。