free()和链表的使用出错

techie 2012-03-16 11:57:43
小弟在C primer plus上面看到一个例子,可是在vs2010中运行它时却出错了。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#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 <1-10>:");
if((scanf("%d",¤t->rating))==0)
{
puts("Enter error!");
exit(1);
}
while(getchar()!='\n')
continue;
puts("Enter next movie title (empty line to stop):");
prev = current;
}

if(head == NULL)
puts("No data enter!");
else
puts("Here is the movie list:");
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; /* error pointer! */
}
printf("Goodbye!\n");
return 0;
}
这个错误要如何解决啊,
...全文
166 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
自信男孩 2012-03-16
  • 打赏
  • 举报
回复
current = head;
while(current != NULL)
{
free(current);
current = current->next; /* error pointer! */
}
这段程序是有问题的,你已经释放了current,是不可以在使用了,在使用会出现未定义的(可能会是段错误)。改一下:
current = head;
struct file *p = NULL;
while(current != NULL)
{
p = current-> next;
free(current);
current = p;
}
Cniao_zhi 2012-03-16
  • 打赏
  • 举报
回复
已经free了current指针,杂找current-next?
Furney 2012-03-16
  • 打赏
  • 举报
回复
这个地方有问题哈。

while(current != NULL)
{
free(current);
current = current->next;
}
techie 2012-03-16
  • 打赏
  • 举报
回复
free(current);
current = current->next;/*错误指针!*/
W170532934 2012-03-16
  • 打赏
  • 举报
回复
什么错误???
techie 2012-03-16
  • 打赏
  • 举报
回复
问题解决了,谢谢大家
maozhihui52102 2012-03-16
  • 打赏
  • 举报
回复
VC6.0下,CPP文件,无压力
nice_cxf 2012-03-16
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 xy598646744 的回复:]

发现个新的问题,如5楼所说:
current = head;
struct file *p = NULL;//这样做编译无法通过,p不能被定义在这里。
while(current != NULL)
{
p = current-> next;
free(current);
current = p;
}

我把p定义在主函数刚开始的地方程序又能编译了:
str……
[/Quote]
扩展名改成.cpp应该就可以了,vs系列支持的c标准太老
techie 2012-03-16
  • 打赏
  • 举报
回复
发现个新的问题,如5楼所说:
current = head;
struct file *p = NULL;//这样做编译无法通过,p不能被定义在这里。
while(current != NULL)
{
p = current-> next;
free(current);
current = p;
}

我把p定义在主函数刚开始的地方程序又能编译了:
struct film * head = NULL;
struct film * prev, * current;
struct film *p = NULL; //定义在这里编译就没有错误了,这是为什么啊?
char input[TSIZE];

69,369

社区成员

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

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