程序能显示正确答案,但是输出完正确答案,程序就异常中断了

七公子v 2019-03-05 10:56:43
#include <stdio.h> #include <stdlib.h> #include <string.h> #define TMAX 45 struct film { char name[TMAX]; int ratting; struct film *next; }; int main(void) { struct film * head = NULL; struct film * pre ; struct film * ra ; char na[TMAX]; puts("输入第一个电影名字"); while ((gets(na) !=NULL)&&(na[0] != '\0')) { ra=(structfile*)malloc(sizeof(struct film)); if (head == NULL) head = ra; else pre->next = ra; ra->next=NULL; strcpy(ra->name, na); puts("输入等级"); scanf("%d", &ra->ratting); while (getchar() != '\n') continue; puts("下一个电影的名字"); pre=ra; } if (head == NULL) puts("木有电影"); else puts("电影如下"); ra = head; while (ra != NULL) { printf("电影:%s 等级:%d\n", ra->name, ra->ratting); ra = ra->next; } ra= head; while (ra != NULL) { free(ra); ra = ra->next; } puts("再见"); return 0; } 实在对不起,电脑没电了,代码导到手机上布局就乱掉了
...全文
159 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
七公子v 2019-03-05
  • 打赏
  • 举报
回复
引用 8 楼 @风轻云淡_的回复:
不过在我看来,继续使用free掉的指针,不管报没报错,出没出问题,一律按错误处理,一律禁止,只是表达还欠缺。
你说的非常有道理,这种做法得禁止,我不会再乱用野指针了
@风轻云淡_ 2019-03-05
  • 打赏
  • 举报
回复
不过在我看来,继续使用free掉的指针,不管报没报错,出没出问题,一律按错误处理,一律禁止,只是表达还欠缺。
@风轻云淡_ 2019-03-05
  • 打赏
  • 举报
回复
引用 6 楼 墨子羽 的回复:
[quote=引用 3 楼 @风轻云淡_的回复:]楼上正解,你已经把当前节点位置的内存free掉了,成野指针了,然后你还让它指向下一个。

嗯嗯,我查了一下,发现你的说法不太合理,不过谢谢你告诉我问题出在哪
网上的回答
也就是说current被free之后,其指向的内容还没有改变,所以还能取得到current->next的值,free只是使current指向的内容可以被其他代码改变,如果在free之后立即被其他代码改变的话,就不能正确的取到current->next的值了。没报错只是偶然现象,内存释放只是告诉OS该内存区域不再被本进程独占,可以被其他进程所使用。至于数据是否马上被改变,要看OS的实际调度情况。[/quote]
你的比较专业
七公子v 2019-03-05
  • 打赏
  • 举报
回复
引用 3 楼 @风轻云淡_的回复:
楼上正解,你已经把当前节点位置的内存free掉了,成野指针了,然后你还让它指向下一个。
嗯嗯,我查了一下,发现你的说法不太合理,不过谢谢你告诉我问题出在哪 网上的回答 也就是说current被free之后,其指向的内容还没有改变,所以还能取得到current->next的值,free只是使current指向的内容可以被其他代码改变,如果在free之后立即被其他代码改变的话,就不能正确的取到current->next的值了。没报错只是偶然现象,内存释放只是告诉OS该内存区域不再被本进程独占,可以被其他进程所使用。至于数据是否马上被改变,要看OS的实际调度情况。
七公子v 2019-03-05
  • 打赏
  • 举报
回复
引用 2 楼 zgl7903的回复:
free 之前记录好下个指针
//while (ra != NULL) { free(ra); ra = ra->next; }
while (ra != NULL) { pre=ra; ra=ra->next; free(pre);}
谢谢大佬了,书上就是我这么写的,我仔细查了一下,发现书上写错了。 (c peimer plus第五版) 你这个答案是正解
七公子v 2019-03-05
  • 打赏
  • 举报
回复
引用 1 楼 墨子羽的回复:
我想知道程序异常中断是代码的问题还是编译器的问题呢,求大神解答
谢谢大佬了,书上就是我这么写的,我仔细查了一下,发现书上写错了。 (c peimer plus第五版) 你这个答案是正解
@风轻云淡_ 2019-03-05
  • 打赏
  • 举报
回复
楼上正解,你已经把当前节点位置的内存free掉了,成野指针了,然后你还让它指向下一个。
zgl7903 2019-03-05
  • 打赏
  • 举报
回复
free 之前记录好下个指针
//while (ra != NULL) { free(ra); ra = ra->next; }
while (ra != NULL) { pre=ra; ra=ra->next; free(pre);}

七公子v 2019-03-05
  • 打赏
  • 举报
回复
我想知道程序异常中断是代码的问题还是编译器的问题呢,求大神解答

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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