【FROM MSDN && 百科】原型:void free(void *ptr);

#include或#include

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 nothingNotice 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

#include

#include

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

#include

#include

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

#include

#include    //perror包含在此文件中

#include

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

#include

#include

#include

int main(void)

{

char *ptr;

ptr=(char *)malloc(100);

strcpy(ptr,"Hello");

free(ptr);    // ptr 所指的内存被释放,但是ptr所指的地址仍然不变,原来的内存变为“垃圾”内存(不可用内存)

#if 1

if (ptr!=NULL)    /* 没有起到防错作用*/

{

strcpy(ptr," world");

printf("%s\n",ptr);

}

#endif

getch();

return 0;

}

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参数 指针,C语言之free函数以及野指针介绍相关推荐

  1. C语言之free函数及野指针

    [FROM MSDN && 百科] 原型:  void free(void *ptr); #include<stdlib.h>或#include <malloc.h& ...

  2. c语言编程中野指针错误,C程序中可怕的野指针

    一.疑问点 指针是C语言一个很强大的功能,同时也是很容易让人犯错的一个功能,用错了指针,轻者只是报个错,重者可能整个系统都崩溃了.下面是大家在编写C程序时,经常遇到的一种错误的使用方法,也许在你的学习 ...

  3. linux野指针追踪,【华清远见】野指针和空指针的两个小点

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 作者:吕老师,华清远见嵌入式学院讲师. 大家都知道指针的学习对于c语言学习来说可谓是至关重要的,下面我们来说一下在指针中两种比较特殊的关于指针的概念,野指 ...

  4. 什么是野指针和内存泄露?如何避免野指针

    内存泄露: (1). 访问已经释放的内存; (2) 访问没有权限的内存 野指针: 指向内存被释放的内存或者没有访问权限的内存的指针. "野指针"的成因主要有3种: (1) 指针变量 ...

  5. 【指针编程】 编写一个函数,利用指针在字符串s中的指定位置pos处(这里插入的位置是从1开始,不是下标。)插入字符串。插入的位置和内容是从键盘输入

    [问题描述] 编写一个函数,利用指针在字符串s中的指定位置pos处(这里插入的位置是从1开始,不是下标)插入字符串.插入的位置和内容是从键盘输入 要求:子函数 void InsertStr(char ...

  6. c语言不定参数个数,C语言中不定参数的实现

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 但是请注意,由於 K&R C 中并不检查参数型态,so 在此是用 ANSI C 来说明,毕竟 ANSI C 是目前所有 C Compiler 都支 ...

  7. c语言 ipc 参数 序列化,c语言编译原理及IPC通信经典面试题

    1. 1 大致描述一个进程在内存中的分布情况 1)代码区:储存程序代码 2)data段:已初始化的全局变量和static变量以及常量字符串.程序结束后自动释放 3)bss段:未初始化的全局变量和sta ...

  8. 系统开发c语言技术参数,1 C语言 gcc 介绍 C 语言编译 main接受参数

    1 C语言 gcc 介绍 C 语言编译 main接受参数 发布时间:2020-07-19 20:18:28 来源:51CTO 阅读:1216 作者:990487026 1第一个c语言的hello wo ...

  9. 属于c语言高级参数的,c语言可变参数的取值

    可变参数的方法必须包含一个不可变的方法,否则会出现错误, 无法获取可变参数的长度,这和一般高级语言是有区别的. int main() { // errorTest(); enableChangePar ...

最新文章

  1. java 计算器 小程序_java应用小程序计算器
  2. 解决猴子选大王问题(用C,原创)
  3. JQuery的插入操作滚动条显示返回顶部
  4. 【设计模式】 桥梁模式
  5. MySQL高级in和not in
  6. 产品设计美学案例分析_美学在产品设计中的重要性
  7. 图像处理技术(三)白平衡
  8. 调制的缺点_DML、EAM与MZI调制的比较
  9. OpenResty安装下载
  10. 程序安装制作不用愁—Wise installation入门教程
  11. 冰点还原离线激活_冰点还原密钥,小编教你如何激活冰点还原
  12. cmd命令查询电脑序列号_WINDOWS 用命令行 找到PC序列号以及计算机名称
  13. 3d3s9.0硬件复制狗
  14. 天才小毒妃 第878章 你喜欢孩子
  15. UiPath-压缩解压缩文件
  16. iOS申请证书,Certificates, Identifiers Profiles 简介
  17. 协同OA产品要完全符合企业的办公模式吗?
  18. PIC16F877A与Proteus仿真-1位7段数码管驱动
  19. win10只能发现部分计算机,Win10的隐藏小秘密,被我发现了
  20. 闲庭信步聊前端 - 见微知著微前端

热门文章

  1. 2016-2017 ACM-ICPC CHINA-Final(EC-final) 题解(10 / 12)
  2. C语言入门练习 - 第二期 判断语句与循环语句(题解)
  3. mysql rpc_使用XML-RPC和MySQL处理中文字符
  4. 东南大学和山东大学计算机学院,东南大学和山东大学都是985、211哪所综合实力更强些呢?...
  5. rsync服务同步,linux日志,screen工具
  6. 个人信息泄露致电信诈骗猖獗 专家:治理亟须完善立法
  7. 1,html常用标签学习
  8. 一个不错的安卓下ssh客户端
  9. SecureCRT上传下载文件
  10. Linux服务器上zsh和bash的对比