【FROM MSDN && 百科】

原型:  void free(void *ptr);

#include<stdlib.h>或#include <malloc.h>

Deallocate space in memory

释放ptr指向的存储空间。被释放的空间通常被送入可用存储区池,以后可在调用malloc、realloc以及realloc函数来再分配。

注意:连续两次使用free函数,肯定会发生错误。malloc的次数要和free的次数相等。

A block of memory previously allocated using a call to malloc, calloc or realloc is deallocated, making it available again for further allocations.

If ptr does not point to a block of memory allocated with the above functions, the behavior is undefined.
If ptr is a null pointer, the function does nothing

Notice that this function does not change the value of ptr itself, hence it still points to the same (now invalid) location

DEMO:

//#define  FIRST_DEMO
#define  SECOND_DEMO
#ifdef FIRST_DEMO
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
int main(void)
{int *buffer1,*buffer2,*buffer3;buffer1=(int *)malloc(100*sizeof(int));buffer2=(int *)calloc(100,sizeof(int));buffer3=(int *)realloc(buffer2,500*sizeof(int));free(buffer1);free(buffer3);getch();return 0;
}
#elif defined SECOND_DEMO
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
int main(void)
{char *str;/*allocate memory for string*/str=(char *)malloc(10);if (str==NULL){perror("malloc"); abort();}else{/*copy "hello" to string*/strcpy(str,"hello");/*display string*/printf("String is %s\n",str);/*free memory*/free(str);}getch();return 0;
}
#endif

DEMO:perror

perror( ) 用来将上一个函数发生错误的原因输出到标准设备(stderr)。参数 s 所指的字符串会先打印出,后面再加上错误原因字符串。此错误原因依照全局变量errno 的值来决定要输出的字符串。

#include <stdio.h>
#include <stdlib.h>   //perror包含在此文件中
#include <conio.h>
int main(void)
{FILE *fp;fp=fopen("abc","r+");if (NULL == fp){perror("abc");}getch();return 0;
}

output:

abc: No such file or directory

DEMO:

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{char *ptr;ptr=(char *)malloc(100);strcpy(ptr,"Hello");free(ptr);    //<span style="font-family: arial, 宋体, sans-serif; font-size: 13.63636302947998px; line-height: 24px; text-indent: 30px;"> ptr 所指的内存被释放,但是ptr所指的地址仍然不变,原来的内存变为“垃圾”内存(不可用内存)</span>
#if 1if (ptr!=NULL)    /*<span style="font-family: arial, 宋体, sans-serif; font-size: 13.63636302947998px; line-height: 24px; text-indent: 30px;"> 没有起到防错作用</span>*/{strcpy(ptr," world");printf("%s\n",ptr);}
#endifgetch();return 0;
}

【FROM: http://blog.csdn.net/onestep365/article/details/1897626】

free(str)后指针仍然指向原来的堆地址,即你仍然可以继续使用,但很危险,因为操作系统已经认为这块内存可以使用,他会毫不考虑的将他分配给其他程序,于是你下次使用的时候可能就已经被别的程序改掉了,这种情况就叫“指针”,所以最好free()了以后再置空
str = NULL;
即本程序已经放弃再使用他。

何谓“野指针”,在这里补充一下。

野指针是指程序员或操作者不能控制的指针。野指针不是NULL指针,而是指向“垃圾”的指针。

造成“野指针”的原因主要有

1.指针变量没有初始化,任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气。在初始化的时候要么指向合法的指针,要么指向NULL。

2.指针变量被free或delete之后,没有设置为NULL。它们只是把指针所指的内存给释放掉,但并没有把指针本身干掉。通常会用语句if (p != NULL)进行防错处理。很遗憾,此时if语句起不到防错作用,因为即便p不是NULL指针,它也不指向合法的内存块。上文DEMO则是这种情况。

3.指针操作超越了变量的作用范围。  注意其生命周期。

【下面是摘自论坛里面的形象比喻,加深理解。】
CRT的内存管理模块是一个管家。   
你的程序(简称“你”)是一个客人。   
管家有很对水桶,可以用来装水的。   
malloc的意思就是“管家,我要XX个水桶”。   
管家首先看一下有没有足够的水桶给你,如果没有,那么告诉你不行。如果够,那么登记这些水桶已经被使用了,然后告诉你“拿去用吧”。   
free的意思就是说:“管家我用完了,还你!”。   
至于你是不是先把水倒干净才给管家,那么是自己的事情了。--是不是清零。   

管家也不会将你归还的水桶倒倒干清(他有那么多水桶,每个归还都倒干净岂不累死了)。反正其他用的时候自己会处理的啦。   
free之后将指针清零只是提醒自己,这些水桶已经不是我的了,不要再完里面放水了,^_^   
如果free了之后还用那个指针的话,就有可能管家已经将这些水桶给了其他人装饮料的了,你却往里面撒了泡尿。好的管家可能会对你的行为表示强烈的不满, 杀了你(非法操作)--这是最好的结果,你知道自己错了(有错就改嘛)。一些不好的管家可能忙不过来,有时候抓到你作坏事就惩罚你,有时候却不知道去那里 了--这是你的恶梦,不知道什么时候、怎么回事情自己就死了。不管怎么样,这种情况下很有可能有人要喝尿--不知道是你的老板还是你的客户了.^_^。   
所以啊,好市民当然是还了给管家的东西就不要再占着啦,.^_^。

C语言之free函数及野指针相关推荐

  1. c语言 free参数 指针,C语言之free函数以及野指针介绍

    [FROM MSDN && 百科]原型:void free(void *ptr); #include或#include Deallocate space in memory 释放ptr ...

  2. C语言逗号表达式赋值、野指针成因、用户标识符、字符串赋值的几个概念

    目录 题目 背景概念梳理 逗号表达式 野指针成因 用户标识符 字符串赋值 解题过程 正确答案 整体代码 参考链接 题目 一.输出x及a的结果 int main(){int x,a;x = (a=3, ...

  3. 理解C语言中的空指针和野指针

    在C语言中,指针是一个非常重要的概念,可以用于操作变量和数据结构.但是,指针也是很容易出错的地方.其中包括两种可能的错误:空指针和野指针. 空指针 空指针指代无效的地址,表示指针不指向内存中的任何一个 ...

  4. c语言野指针导致问题,C语言进阶之路(三)----野指针的产生原因及解决办法

    1.会产生野指针的做法 #include //这就是一种错误的写法 int main(){ int *p = NULL; p = (int *)malloc(); //释放P所指向的内存空间,但指针变 ...

  5. C语言 野指针 - C语言零基础入门教程

    目录 一.简介 二.野指针产生的原因 1.指针变量未初始化 2.指针释放后之后未置空 三.避免野指针产生 1.初始化时置 NULL 2.释放时置 NULL 四.猜你喜欢 零基础 C/C++ 学习路线推 ...

  6. C语言中的“悬空指针”和“野指针”是什么意思?

    提起C语言大部分开发者很自然就会想到指针二字,没错,作为C的核心和灵魂,它的地位咱们就不再赘述了,今天我们想跟大家讲的是指针中的两个特有名词:"悬空指针"和"野指针&qu ...

  7. c语言创建一个文件函数,c语言文件读写函数 用C语言的函数创建、打开和读写文件...

    C语言文件读写结构体里面的数据怎样存到磁盘文件上 c语言对同一个文件进行读写(r+) 编写程序,将文本文件c.txt中的所有小写字母转换成相应的大写字母,其他一.标准文件的读写 1.文件的打开 fop ...

  8. Go 知识点(19)— Go 语言中的野指针

    野指针是一种指向内存位置是不可知的指针,一般是由于指针变量在声明时没有初始化所导致的.在 Go语言中,布尔类型的零值为 false,数值类型的零值为 0,字符串类型的零值为 "", ...

  9. 【C 语言】内存管理 ( 动态内存分配 | 栈 | 堆 | 静态存储区 | 内存布局 | 野指针 )

    相关文章链接 : 1.[嵌入式开发]C语言 指针数组 多维数组 2.[嵌入式开发]C语言 命令行参数 函数指针 gdb调试 3.[嵌入式开发]C语言 结构体相关 的 函数 指针 数组 4.[嵌入式开发 ...

最新文章

  1. AAAI 2021 最「严」一届发榜,1692 篇论文中选,录取率仅为 21%
  2. Java—FileOperator
  3. c语言一行代码太长,C语言修改一行代码,运行效率居然提升数倍,这个技巧你知道吗...
  4. 92. Leetcode 63. 不同路径 II (动态规划-路径规划)
  5. PythonOpenCV--Rtrees随机森林
  6. 李嘉诚今日正式退休,来看看他一生都做过哪些牛逼的事
  7. Spring系列(十):@Autowired 和@Resource注解用法介绍
  8. python rsa加密二进制文件_用Python中的RSA加密文件
  9. 什么是Cookie对象,Session对象,Application对象等问题
  10. cookie中转注入
  11. jQuery 插件设置cookie
  12. CityEngine 2014安装教程
  13. 纯代码给wordpress增加说说/微博/微语功能
  14. DBUtils工具类
  15. xp计算机用户账户密码删除,xp强行删除管理员开机密码
  16. 如何用一根网线连接两台电脑,传输大文件
  17. Intelligent information retrieval(智能信息检索综述)
  18. WordPress增加网站地图
  19. oracle用户剩余空间,ORACLE 中删除了表肿么硬盘剩余空间没变?
  20. Lamp 架构 搭建 论坛网站

热门文章

  1. datagrid数据表格当数据为0的时候页面不显示数据
  2. oracle11g安装过程提示swap size 检查失败问题
  3. 基于Metronic的Bootstrap开发框架经验总结(2)--列表分页处理和插件JSTree的使用...
  4. 转: 从微信的故障谈谈服务可用性
  5. 树状数组与离散化与求第K大模板
  6. Seconds_Behind_Master
  7. 《JavaScript权威指南第六版》学习笔记-JavaScript概述
  8. 【2015-10-19】内存管理---深浅拷贝,autorelease,ARC(自动引用计数)
  9. com.android.providers.telephony.MmsSmsDatabaseHelper
  10. keyCode(ASCII)与键盘按键对照表