当前位置: 首页 > java >正文

初学c语言20(动态内存管理)

内存分配通常分为三个区域,分别为栈区、堆区、静态区,图像如下:

栈区、静态区开辟的空间都是固定的,而堆区上可以自主开辟空间和调整空间大小

动态内存开辟有四个函数:

头文件:stdlib.h

一.mallloc

形式:

功能向堆区申请一片连续的空间

参数:

size:要开辟空间的大小,单位为字节

返回值:

开辟成功时,返回这片空间的起始地址(类型为void*

开辟失败时,返回空指针

所以每次开辟空间都要检查是否为空

注意动态内存开辟的空间不会自动释放(除了整个程序结束)

当开辟空间使用完后要及时释放,不然可能会造成内存泄漏如开辟空间后当存放该地址的指针变量被释放时,再也找不到该空间,导致开辟的空间释放不了会一直存在至整个程序结束才被销毁),所以c语言有个函数来释放堆区开辟的空间

二.free

形式:

功能释放堆区动态内存开辟的空间不能释放其他区域的

参数:

ptr:开辟空间的起始地址,为空指针时什么事也不做

注意释放后要及时将指针改为空指针,不然会变为野指针,有危险,而且不能释放内存的一部分,得从内存起始位置开始释放

应用:

三.calloc

形式:

功能除了会将开辟的空间每个字节初始化为0其他malloc一样

参数代表num个大小为size的元素

应用:

四.realloc

形式:

功能调整动态内存开辟的空间

参数:

ptr:要调整内存的起始地址必须是起始地址

size:调整之后空间的大小,单位为字节

返回值:

调整之后的起始地址,调整失败返回空指针

realloc再调整内存空间分为俩种情况:

1.直接在原内存空间后面追加空间原空间之后有足够的空间

2.重新找一片连续空间,将旧空间的数据拷贝到新空间里,旧空间自动释放,所以返回的是新空间的起始地址原空间之后没有足够的空间

应用:

五.练习

代码:

#include <stdio.h>#include <stdlib.h>
#include <string.h>void GetMemory(char *p){p = (char *)malloc(100);}void Test(void){char *str = NULL;GetMemory(str);strcpy(str, "hello world");printf(str);}int main(){Test();return 0;}

结构和解释:

优化:

六.柔性数组

结构体最后一个成员是未知大小的数组叫做柔性数组成员

形式:

特点:

1.柔性数组成员前面至少有一个成员

2.sizeof()计算不包括柔性数组的内存

3.包含柔性数组成员的结构⽤malloc()函数进⾏内存的动态分配,并且分配的内存应该⼤于结构的⼤ ⼩,以适应柔性数组的预期⼤⼩

举例:

http://www.xdnf.cn/news/8668.html

相关文章:

  • 浅析SpringBoot中的classpath
  • C++——volatile
  • C#学习第25天:GUI编程
  • 视频剪辑 VEGAS - 配置视频片段保持原长宽比
  • 2025 中青杯数学建模AB题
  • 加州房价预测:基于 Python 的多元回归分析实践
  • PP-YOLOE-SOD学习笔记2
  • ruoyi-erp 开源:功能全面灵活可定制
  • 25Yunxi期中
  • 基于CSP模型实现的游戏排行榜
  • 【Qt开发】进度条ProgressBar和日历Calendar Widget
  • 消息队列在异步推理任务中的作用
  • leetcode hot100刷题日记——14.二叉树的最大深度
  • pyhton基础【2】基本语法
  • CodeForces - 1692D
  • 算法笔记·数学·欧拉函数
  • PCB布局设计
  • Windows逆向工程提升之IMAGE_BASE_RELOCATION
  • 使用Python操作Mysql数据库
  • 【VBA 字典的引用和调用方法】
  • 【笔记】如何解决GitHub报错403
  • [创业之路-377]:企业战略管理案例分析-战略制定/设计-市场洞察“五看”:看宏观之社会发展趋势:数字化、智能化、个性化的趋势对初创公司的战略机会
  • 品鉴JS的魅力之防抖与节流【JS】
  • 英语写作中“随着……的出现”with the advent of 的用法
  • 03-工具篇-SSH远程登录ubuntu系统
  • 同为科技 智能PDU产品选型介绍 EN10/I801CI
  • Elasticsearch实操案例
  • Linux Shell编程(九)
  • 贪心介绍 LeetCode 455.分发饼干 LeetCode 376. 摆动序列 LeetCode 53. 最大子序和
  • C# 异步方法中缺少 `await` 运算符的隐患与解决方案