【发布时间】:2020-08-12 00:21:57
【问题描述】:
这是我的代码:
struct movie {
char movie_name[30];
float score;
struct movie *next;
};
typedef struct movie *p_movie;
void print_all(struct movie *head);
int main() {
p_movie head = NULL;
p_movie new_node = malloc(sizeof(struct movie));
if (new_node == NULL) {
exit(1);
}
strcpy(new_node->movie_name, "Avatar");
new_node->score = 9.5f;
new_node->next = NULL;
if (head == NULL)
head = new_node;
print_all(head);
new_node = malloc(sizeof(struct movie));
if (new_node == NULL) {
exit(1);
}
strcpy(new_node->movie_name, "Aladdin");
new_node->score = 8.0f;
new_node->next = NULL;
p_movie temp = head;
head = new_node;
new_node->next = temp;
print_all(head);
}
void print_all(struct movie *head) {
printf("---------------------\n");
printf("Head address = %zd\n", (size_t)head);
struct movie* search = head;
while (search != NULL) {
printf("%zd \"%s\" %f %zd\n", (size_t)search, search->movie_name,
search->score, (size_t)search->next);
search = search->next;
}
}
我因为malloc而感到困惑:它运行良好,但我不知道为什么这段代码运行良好。
我的问题是关于new_node:首先,我将内存分配给new_node,我不释放它并再次分配内存。
那么,第一个内存 (Avatar) 发生了什么?是不是删了还是保存在某个地方..?
【问题讨论】:
-
虽然有你可以分配的空闲(虚拟)内存。 C 中没有垃圾收集器,当您丢失了分配块的地址时,该地址对您“丢失”但仍存在于内存中,这就是内存泄漏。
-
我建议你不要像在
typedef struct movie* p_movie;中那样使用typedef来定义'pointer to' 类型,隐藏指针会使代码难以阅读,并且是一种容易引入错误的好方法 -
您不需要
p_movie temp = head;,您只是在混淆自己。正在发生的是new_node->next = head; head = new_node;,这是一种称为前向链接的方法,它在列表的前面添加节点(如堆栈)。不利的一面是,您的列表与输入的顺序相反。
标签: c memory memory-management linked-list malloc