0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

周立功“程序设计与数据结构”:深度解剖动态分布内存的free()函数与realloc()函数

AGk5_ZLG_zhiyua 来源:ZLG致远电子 作者:佚名 2017-08-25 14:22 次阅读


周立功教授数年之心血之作《程序设计与数据结构》,书本内容公开后,在电子行业掀起一片学习热潮。经周立功教授授权,本公众号特对本书内容进行连载,愿共勉之。

第一章为程序设计基础,本文为1.9.3 free()函数和1.9.4 realloc()函数。

>>>>1.9.3free()函数

对于程序而言,不可再访问的内存块被称为垃圾,留有垃圾的程序存在内存泄漏现象。虽然一些语言提供了垃圾收集器用于垃圾的自动定位和回收,但C语言不提供。要求每个程序负责回收各自的垃圾,方法是调用free()函数释放不需要的内存。

通常malloc()要与free()配套使用,当动态内存使用完毕时,如果不及时释放的话,必然导致“内存泄露(即内存空间减少)”,进而影响程序的正常运行。释放内存的free()函数原型如下:

void free(void *pointer);

即将malloc()返回的指针pointer作为参数传给free()释放内存。虽然free()函数允许收回不再需要的内存,但使用此函数会导致一个新的问题:悬空指针。虽然调用free(pi)函数会释放pi,但不会改变pi本身。如果忘记了pi不再指向有效内存块,那么混乱就有可能随即而来:

char *pi = malloc(5);

free(pi);

strcpy(pi, "abc");// 错误

即修改了pi指向的内存是严重的错误,因为程序对此内存失去了控制权。事实上,悬空指针是很难发现的,因为几个指针可能指向相同的内存块,在释放内存块后,全部的指针都悬空了。有了free()函数,也可以用malloc()在运行时分配一块连续的内存空间,达到改变数组大小的目的。比如:

char * pi = malloc(5);

即变量pi指向已经在堆内分配的5个连续字节,好像声明了一个有5个字符的数组一样,显然动态数组就是分配在“堆”上,用指针变量引用的数组。分配动态数组的步骤如下:

● 声明一个指针变量用于保存数组变量首元素的地址;

调用malloc()为数组变量中的元素分配内存

●将malloc()的结果赋给指针变量。

由于不同的数据类型占用的内存大小不一样,其大小为数组变量元素个数乘以每个元素所占内存的大小。比如,有5个int型元素的数组变量需要分配内存。比如:

int *pi = malloc(5 * sizeof(int));

和数组不同的是,当不再使用时,必须释放内存。比如:

free(pi);

如果需要10个元素才够用,那么应该先释放原内存,然后再申请新内存。比如:

free(pi);

pi = malloc(10 * sizeof(int));

显然,存放在原内存的数据不见了,为了保留原来的数据,需要再做些工作:

int *temp = pi; //让temp指向原内存

pi = malloc(10 * sizeof(int)); //让pi指向新内存

memcpy(pi, temp, 5 * sizeof(int));//将原内存的数据拷贝到新内存

free(temp); //释放原内存

但上面的工作仅需一条语句即可完成,比如:

pi = realloc(pi, 10*sizeof(int));

由于free函数不会检查传入的指针是否为NULL,也不会在返回前将指针设置为NULL,因此程序员会创建自己的free函数,saferfree函数的接口和实现详见程序清单 1.49和程序清单 1.50。

程序清单1.49saferfree()函数的接口(saferFree.h)

1 #pragma once

2 void saferFree(void **pp);

程序清单1.50saferfreeh函数接口的实现(saferFree.c)

1 #include

2 #include

3

4 void saferFree(void **pp)

5 {

6 if(pp != NULL && *pp != NULL)

7 free(*pp);

8 *pp = NULL;

9 }

10 }

如果使用saferFree宏调用saferFree函数,则可以省略类型转换和传递指针的地址。即:

#define NewSaferFree(P) saferFree((void **)&p)

其调用形式如下:

int *pi = malloc(sizeof(int));

NewSaferFree(pi);

>>>1.9.4realloc()函数

alloc是allocate分配的缩写,前缀re就是重新分配的意思。如果原内存后面还有剩余的话,realloc()只是修改分配表,还是返回原内存的地址;如果没有剩余内存的话,realloc()将申请新的内存,然后将原内存的数据拷贝到新内存中,原内存将被free()释放掉,realloc()返回新内存的地址。realloc()函数原型如下:

void *realloc(void *pointer, unsigned int size);

当调用realloc()函数时,point必须指向先前通过malloc、calloc或realloc的调用获得的内存块。size表示新分配内存的大小,以字节为单位。其作用是将pointer所指向的动态空间的大小改变为size,pointer的值不变。如果重新分配不成功,则返回NULL;如果通过malloc()已经获得了动态空间,又不想改变其大小,则可以使用realloc()重新分配。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数据结构
    +关注

    关注

    3

    文章

    564

    浏览量

    39900
  • 周立功
    +关注

    关注

    38

    文章

    130

    浏览量

    37082

原文标题:周立功:动态分布内存——free()函数与realloc()函数

文章出处:【微信号:ZLG_zhiyuan,微信公众号:ZLG致远电子】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    程序设计数据结构》周立功数十年心血力作

    为了将实际开发过程中总结的有价值的技术应用分享给大家,周立功及其团队整理出《程序设计数据结构》这本书,其内容如同培训讲师的教案,是周立功和团队的读书笔记和
    发表于 05-26 10:06 22次阅读

    立功程序设计数据结构》:字符串函数

    本文为程序设计基础,本文为1.8.2 字符串常量第三点:字符串函数
    的头像 发表于 09-05 09:18 5467次阅读

    立功单片机配套读物--数据结构域计算方法初步

    立功单片机配套读物--数据结构域计算方法初步
    发表于 10-14 10:46

    新书创作谈:立功教授数十年之心血力作《程序设计数据结构

    ` 近日,立功教授公开了数十年之心血力作《程序设计数据结构》,此书在4月28日落笔,电子版已无偿性分享到电子工程师与高校群体,在致远电子公众号后台回复关键字【
    发表于 05-15 18:04

    【完整资料】《程序设计数据结构立功数十年心血力作

    ,是立功和团队的读书笔记和程序设计实践的心得。《程序设计数据结构》重点阐述了三大方向内容。C语言学习中的痛点:针对当前工程师在C语言学习
    发表于 05-16 16:43

    程序设计数据结构

    本帖最后由 lee_st 于 2017-10-31 09:04 编辑 程序设计数据结构(仅供阅览不可印刷)
    发表于 10-21 20:09

    程序设计数据结构

    本帖最后由 lee_st 于 2018-6-16 02:32 编辑 程序设计数据结构(仅供阅览不可印刷)
    发表于 06-15 02:33

    程序设计数据结构》【完整资料】分享!

    现象,甚至成为一位阅读程序者。 为了将实际开发过程中总结的有价值的技术应用分享给大家,立功及其团队整理出《程序设计数据结构》这本书,其内
    发表于 08-31 16:20

    使用malloc()和 free()函数动态的分配/释放内存的危害

    前言本文会从以下几个方面阐述使用malloc()和 free()函数动态的分配/释放内存的危害。存在的问题在嵌入式中无法很难实现对内存
    发表于 12-14 07:56

    C语言入门教程-动态数据结构

    动态数据结构 动态数据结构可以根据需要,从称之为堆的内存空间上分配和释放内存
    发表于 07-29 11:51 1052次阅读

    C语言入门教程-malloc函数free函数

    malloc函数free函数 假设您的程序在执行过程中需要分配一定量的内存。您可以随时调用malloc
    发表于 07-29 11:58 4554次阅读

    MicroBlaze:malloc 函数动态分配内存溢出

    首先说明一点,MicroBlaze C函数库支持标准的内存管理函数,如malloc(),calloc(), free(),这些标准的C函数
    发表于 02-11 11:43 1645次阅读
    MicroBlaze:malloc <b class='flag-5'>函数</b><b class='flag-5'>动态</b>分配<b class='flag-5'>内存</b>溢出

    立功动态分布内存——malloc()函数与calloc()函数

    立功教授数年之心血之作《程序设计数据结构》,电子版已无偿性分享到电子工程师与高校群体,在公众号回复【程序设计】即可在线阅读。书本内容公开后,在电子行业掀起一片学习热潮。经周
    的头像 发表于 08-22 17:01 4637次阅读

    算法与数据结构——哈希表

    立功教授数年之心血之作《程序设计数据结构》以及《面向第三章为算法与数据结构,本文为3.5 哈希表。
    的头像 发表于 09-25 11:37 5245次阅读
    算法与<b class='flag-5'>数据结构</b>——哈希表

    C语言程序设计学习之数组中的指针资料说明

    C程序设计中使用指针可以:使程序简洁、紧凑、高效,有效地表示复杂的数据结构,动态分配内存,得到多于一个的
    发表于 11-16 17:47 19次下载
    C语言<b class='flag-5'>程序设计</b>学习之数组中的指针资料说明