一.malloc函数

C 库中有个函数 void *malloc(size_t size) ,该函数作用为分配所需的内存空间,并返回一个指向它的指针。

参数:

  • size -- 内存块的大小,以字节为单位。

返回值:

  • 返回一个指针 ,指向已分配大小的内存。如果请求失败,则返回 NULL。

二.free函数

C 库中有个函数 void free(void *ptr) ,该函数作用为释放之前调用 calloc、malloc 或 realloc 所分配的内存空间。

参数:

  • ptr -- 指针指向一个要释放内存的内存块,该内存块之前是通过调用 malloc、calloc 或 realloc 进行分配内存的。如果传递的参数是一个空指针,则不会执行任何动作。

返回值:

  • 该函数不返回任何值。

三.追踪已分配空间的大小

在这里你可能注意到,void free(void *ptr) 参数中只需要传入一个指针参数,就可以释放掉所分配的内存,它是如何确定指针所指向的区域分配了多大的内存空间呢?为了完成释放任务,很多内存分配函数都会在一个称之为头部指针(header,或者称之为头块)的地方保存一些额外的信息,头部指针通常在放回的内存块之前。

举个例子,现在要申请一块20个字节的内存空间,有prt指针保存内存空间的首地址,那么代码可以简略地写成如下:

ptr=malloc(20)

那么在所返回给用户的指针ptr上,还有一小块内存用于保存该内存块的信息:

该头部指针至少会包含所分配的空间大小,还有一些其他的数据用来进行一些完整性的检查,假如一个简单的头部指针包含了如下东西:

typedef struct header_t{int size;int magic;
}header_t;

那么头部指针的具体内容大概如下所示:

而用户在进行释放时,库会通过一些简单的指针运算得到头部指针的位置:

void free(void* ptr){header_t *hptr=(void*)ptr - sizeof(header_t);
}

获得头部指针后,程序先检查下是否符合逾期的值,然后简单地运算下得出要释放的空间大小,进行内存释放。值得注意的是实际释放的空间是头部指针的大小+分配给用户使用的空间大小,而不是单纯地释放用户使用的那点内存空间。

【C语言】free函数如何知道要释放多大空间相关推荐

  1. 初学者关于c语言中函数局部变量空间释放的理解

    比如下面一段代码: #include <stdio.h>int* fun();int* fun(){int a;a = 1;return &a; }int main(){int * ...

  2. linux c语言 malloc动态分配指针,C语言malloc函数为一维,二维,三维数组分配空间...

    c语言允许建立内存动态分配区域,以存放一些临时用的数据,这些数据不必在程序的声明部分定义,也不必等到函数结束时才释放,而是需要时随时开辟,不需要时随时释放,这些数据存储在堆区.可以根据需要,向系统申请 ...

  3. C语言中函数参数传递

    C语言中函数参数传递的三种方式 (1)值传递,就是把你的变量的值传递给函数的形式参数,实际就是用变量的值来新生成一个形式参数,因而在函数里对形参的改变不会影响到函数外的变量的值. (2)地址传递,就是 ...

  4. ostream作为函数返回值_GO语言基础函数

    GO语言基础–函数 函数是组织好的.可重复使用的.用于执行指定任务的代码块.本文介绍了Go语言中函数的相关内容. 函数定义 Go语言中定义函数使用func关键字,具体格式如下: func 函数名(参数 ...

  5. C语言 abort 函数 - C语言零基础入门教程

    目录 一.abort 函数简介 二.abort 函数使用 三.猜你喜欢 零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门 一.abort 函数简介 C 语 ...

  6. 一起学习C语言:函数(四)

    上一篇<一起学习C语言:函数(三)> 中,我们了解了变量的储存类别与声明方式,以及函数的递归调用原理.本章节,我们分析函数的指针调用,以及函数指针作函数参数使用的场景. 章节预览: 8. ...

  7. 一起学习C语言:函数(三)

    上一篇<一起学习C语言:函数(二)> 中,我们了解了内部函数和外部函数,以及变量的声明周期与作用域.本章节,我们分析函数的存储类别与声明方式,以及函数的递归调用原理. 章节预览: 6. 变 ...

  8. linux之getcwd函数解析,Linux 中C语言getcwd()函数的用法

    Linux 中C语言getcwd()函数的用法 先来看该函数的声明: #include char *getcwd(char *buf,size_t size); 介绍: 参数说明:getcwd()会将 ...

  9. C语言的函数是什么?

    文章目录 函数是什么 C语言中函数的分类 库函数 如何学会使用库函数? 自定义函数 函数的参数 函数的调用 传值调用 传址调用 函数的嵌套调用和链式访问 嵌套调用 链式访问 函数的声明和定义 函数声明 ...

最新文章

  1. QT各种版本第三方下载地址
  2. 在Python中使用XGBoost
  3. 计算器的程序代码java_求用JAVA编写的计算器程序代码
  4. mysql链路跟踪工具_SkyWalking全链路追踪利器
  5. python百钱买百鸡问题答案_PHP/Python---百钱百鸡简单实现及优化
  6. 2021大数据1班《Python程序设计基础》学生学期总结
  7. android 4.2版本的sdcard文件目录分析
  8. Leecode刷题热题HOT100(3)——无重复字符最长子串
  9. 项目中用到的一些特殊字符和图标
  10. Vue项目使用AES做加密
  11. qt html5播放器,Qt实现网络播放器
  12. xbox360fsd更新游戏封面_xbox360自制系统fsd更新封面教程
  13. 使用Windows Sysprep来封装系统
  14. ❀❀❀Excel加载项开发及发布❀❀❀
  15. Quoted-printable编码的介绍和quopri库的使用
  16. dango models and database ---- verbose name
  17. pdf编辑器免安装版_墙裂推荐!功能强大的PDF编辑器最新免安装版!
  18. Django rest framework --- Routers
  19. 路由器什么牌子好?消灭卡顿畅快吃鸡
  20. Android刘海屏、水滴屏全面屏适配详解,android开发权威指南

热门文章

  1. 高速下载Ubuntu系统【清华大学开源软件镜像站】(ubuntu-22.04.1-desktop-amd64.iso)
  2. 直播行业的“杀手锏”
  3. 游戏数据上链面临的挑战
  4. 世界地图(the world map)
  5. 《Think Python》练习 4-3:用函数画雨伞
  6. ubuntu 安装 opencv
  7. 数组reduce方法详解
  8. 2021-08-26 js合并两个对象
  9. 学计算机用16g内存,电脑内存8G和16G有什么区别?电脑内存8G和16G的区别详解
  10. python----生成二维码