free( )的一个理解(《C Primer Plus》的一个错误)
来源:互联网 发布:e25歼击车数据 编辑:程序博客网 时间:2024/05/16 00:37
在看《C Primer Plus(第五版)》的链表部分时,书上有个例子,敲下来,运行会有错误提示,我也觉得有点问题。又在网上查了下,确实有点问题,一个关于free()的有点隐蔽的问题。
代码如下:
/* films2.c -- 使用结构链表*/#include "stdafx.h"#include <stdio.h> #include <stdlib.h>#include <string.h>#define TSIZE 45struct film{ char title[TSIZE]; int rating; struct film *next;};int main(int argc, char* argv[]){ 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. "); 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("Bye!\n"); return 0;}
问题就出在最后释放内存的部分,会提示有bug,查阅了网上的相关说明,觉得言之有理,如下
一、如果已经释放,那么为啥还能指到当前结构的next成员?指针变量中存储的是内存地址,释放内存,只是将这块地址的使用权交出去了,而变量的值(地址)系统并不进行修改。释放的是内存,不是变量!!二、那么释放该内存后,这块内存,实际是把权限交出了,可以在使用了,那么只要不在使用,该内存的数据,和先前存入的一样?是的,如果没有在这块内存中重新写入数据,这块内存中的数据是不会发生变化的。但是你的写法有可能会出问题while (current != NULL){ free(current); //先释放, current = current->next; //再使用该内存,会有BUG,随时都可能会有程序去占用或更改这块内存,而造成你的程序运行出错!}正确写法while (current != NULL){ struct film *p=current ; current = current->next; free(p);}
修改之后,正确运行。
可见,使用malloc(),free()大大增加了程序的灵活和方便,但是使用的时候要小心,再小心。
1 0
- free( )的一个理解(《C Primer Plus》的一个错误)
- C primer plus第五版第十七章film2.c的一个错误
- 发现中文版《C Primer Plus第五版》示例程序的一个错误
- C++ primer plus里的一个程序
- 一个可能的C++primer Plus第164页第6题的答案
- C Primer Plus学习 十二 使用嵌套if显示一个数的约数
- C Primer Plus学习 敲代码的错误1
- for循环一个常见的错误(c++primer 3.13题)
- 一个比较简单的c-free问题
- c++ primer上的一个错误
- 读书笔记——《C Primer Plus》: 一个例程divisors.c
- linux下C语言编程 一个堆栈错误的原因:*** glibc detected *** ./test: free(): invalid pointer:
- linux C 一个堆栈错误的原因:*** glibc detected *** ./test: free():invalid pointer:
- C primer plus 第七章 练习6: 编写一个程序读取输入,直到#,并报告序列ei出现的次数。
- C primer plus 第七章 练习9: 编写一个程序,接受一个整数输入,然后显示所有小于或等于该数的素数。
- C++primer原书中的一个错误(派生类using声明对基类权限的影响)
- C++primer习题答案中关于迭代器使用的一个错误
- 笔记(1)一些简单的输入输出--C Primer Plus
- BI解决方案分享:地产BI数据分析系统的建设
- sqlite3自增key设定(创建自增字段)
- 错误:Unsupported major.minor version 51.0(jdk版本错误)
- 消息队列
- Android APK反编译01
- free( )的一个理解(《C Primer Plus》的一个错误)
- 播放Android项目工程里的视频文件
- 別れと出会いの春に
- 一招瞬间让微信公共平台菜单变的高大上,漂亮的方法(微信运营必看)
- 【软件后门】QQ密码框 - 2010
- org.hibernate.PropertyAccessException: Null value was assigned to a property。。。。完美解决
- Hue 可视化的Hadoop架构工具
- Android代码设置Shape,corners,Gradient
- 线程中更新 UILabel的text