【C语言】free函数如何知道要释放多大空间
一.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函数如何知道要释放多大空间相关推荐
- 初学者关于c语言中函数局部变量空间释放的理解
比如下面一段代码: #include <stdio.h>int* fun();int* fun(){int a;a = 1;return &a; }int main(){int * ...
- linux c语言 malloc动态分配指针,C语言malloc函数为一维,二维,三维数组分配空间...
c语言允许建立内存动态分配区域,以存放一些临时用的数据,这些数据不必在程序的声明部分定义,也不必等到函数结束时才释放,而是需要时随时开辟,不需要时随时释放,这些数据存储在堆区.可以根据需要,向系统申请 ...
- C语言中函数参数传递
C语言中函数参数传递的三种方式 (1)值传递,就是把你的变量的值传递给函数的形式参数,实际就是用变量的值来新生成一个形式参数,因而在函数里对形参的改变不会影响到函数外的变量的值. (2)地址传递,就是 ...
- ostream作为函数返回值_GO语言基础函数
GO语言基础–函数 函数是组织好的.可重复使用的.用于执行指定任务的代码块.本文介绍了Go语言中函数的相关内容. 函数定义 Go语言中定义函数使用func关键字,具体格式如下: func 函数名(参数 ...
- C语言 abort 函数 - C语言零基础入门教程
目录 一.abort 函数简介 二.abort 函数使用 三.猜你喜欢 零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门 一.abort 函数简介 C 语 ...
- 一起学习C语言:函数(四)
上一篇<一起学习C语言:函数(三)> 中,我们了解了变量的储存类别与声明方式,以及函数的递归调用原理.本章节,我们分析函数的指针调用,以及函数指针作函数参数使用的场景. 章节预览: 8. ...
- 一起学习C语言:函数(三)
上一篇<一起学习C语言:函数(二)> 中,我们了解了内部函数和外部函数,以及变量的声明周期与作用域.本章节,我们分析函数的存储类别与声明方式,以及函数的递归调用原理. 章节预览: 6. 变 ...
- linux之getcwd函数解析,Linux 中C语言getcwd()函数的用法
Linux 中C语言getcwd()函数的用法 先来看该函数的声明: #include char *getcwd(char *buf,size_t size); 介绍: 参数说明:getcwd()会将 ...
- C语言的函数是什么?
文章目录 函数是什么 C语言中函数的分类 库函数 如何学会使用库函数? 自定义函数 函数的参数 函数的调用 传值调用 传址调用 函数的嵌套调用和链式访问 嵌套调用 链式访问 函数的声明和定义 函数声明 ...
最新文章
- QT各种版本第三方下载地址
- 在Python中使用XGBoost
- 计算器的程序代码java_求用JAVA编写的计算器程序代码
- mysql链路跟踪工具_SkyWalking全链路追踪利器
- python百钱买百鸡问题答案_PHP/Python---百钱百鸡简单实现及优化
- 2021大数据1班《Python程序设计基础》学生学期总结
- android 4.2版本的sdcard文件目录分析
- Leecode刷题热题HOT100(3)——无重复字符最长子串
- 项目中用到的一些特殊字符和图标
- Vue项目使用AES做加密
- qt html5播放器,Qt实现网络播放器
- xbox360fsd更新游戏封面_xbox360自制系统fsd更新封面教程
- 使用Windows Sysprep来封装系统
- ❀❀❀Excel加载项开发及发布❀❀❀
- Quoted-printable编码的介绍和quopri库的使用
- dango models and database ---- verbose name
- pdf编辑器免安装版_墙裂推荐!功能强大的PDF编辑器最新免安装版!
- Django rest framework --- Routers
- 路由器什么牌子好?消灭卡顿畅快吃鸡
- Android刘海屏、水滴屏全面屏适配详解,android开发权威指南