这个例子是不是有问题?

ProgrammingRing 2010-10-28 01:01:52

#include <stdio.h>
#include <stdlib.h> /* 提供malloc原型 */
#include <string.h> /* 提供strcpy原型 */

#define TSIZE 45

struct film {
char title[TSIZE];
int rating;
struct film * next; /* 指向链表的下一个结构 */
};

int main(void)
{
struct film * head = NULL;
struct film * prev, * current;
char input[TSIZE];

/* 收集并存储信息 */
puts("Enter first movie title: ");
while(gets(input) != NULL && input[0] != '\0')
{
current = (struct film *)malloc(sizeof(struct film));
if(head == NULL) /* 第一个结构 */
head = current;
else /* 后续操作 */
prev->next = current;
current->next = NULL;
strcpy(current->title, input);
puts("Enter your rating <0-10>: ");
scanf("%d", ¤t->rating);
while(getchar() != '\n')
continue;
puts("Enter next movie title (empty line to stop): ");
prev = current;
}
/* 给出电影列表 */
if(head == NULL)
printf("No data entered.\n");
else
printf("Here is the movie list: \n");
current = head;
while(current != NULL)
{
printf("Movie: %s Rating: %d\n", current->title, current->rating);
current = current->next;
}
/* 任务已完成,因此释放所有分配的内存 */
current = head;
while(current != NULL)
{
free(current);
current = current->next;
}
printf("Bey\n");
return 0;
}

上面是 C Primer Plus 第17章的一个例题,说链表的,可是有最后内存释放那里有问题啊,vc6编译运行错误
...全文
83 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
ProgrammingRing 2010-10-28
  • 打赏
  • 举报
回复
汗。。果然是错了,搞得我纳闷半天。。内存都释放了怎么找到下一个地址。。也不知道作者是咋运行的。。。谢谢各位了
C4Fun 2010-10-28
  • 打赏
  • 举报
回复
while(current != NULL)
{
free(current); //current ???
current = current->next; //current->next?????
}
printf("Bey\n");


LZ看的什么书啊! 难道别人本意是。current = NULL;?
黎翔 2010-10-28
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 liuqichun2008 的回复:]

引用 2 楼 liuqichun2008 的回复:
while(current != NULL)
{
free(current);
current = current->next;
}
free之后,current所指的内存就被释放了,然后再current->next肯定会出错撒,可以先在之前声明个变量
struct film *next;
把while变成
while(cur……
[/Quote]
mark
zhutianjin4355255 2010-10-28
  • 打赏
  • 举报
回复
确实,空间都销毁了,还在用
while(current != NULL)
{
free(current);
current = current->next;
}
dooX8086 2010-10-28
  • 打赏
  • 举报
回复
嗯,是有点问题。



/* 任务已完成,因此释放所有分配的内存 */
next = current = head; //
while(current != NULL)
{
next = current->next; //
free(current);
current = next; //
}



liuqichun2008 2010-10-28
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 liuqichun2008 的回复:]
while(current != NULL)
{
free(current);
current = current->next;
}
free之后,current所指的内存就被释放了,然后再current->next肯定会出错撒,可以先在之前声明个变量
struct film *next;
把while变成
while(current != NULL)
{……
[/Quote]然后再free(current->next)肯定会出错撒
liuqichun2008 2010-10-28
  • 打赏
  • 举报
回复
while(current != NULL)
{
free(current);
current = current->next;
}
free之后,current所指的内存就被释放了,然后再current->next肯定会出错撒,可以先在之前声明个变量
struct film *next;
把while变成
while(current != NULL)
{
next=current->next;
free(current);
current = next;
}
luciferisnotsatan 2010-10-28
  • 打赏
  • 举报
回复
current都free了,current->next会有问题。
书上的例子不一定能拿来编译运行

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧