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

初学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()函数进⾏内存的动态分配,并且分配的内存应该⼤于结构的⼤ ⼩,以适应柔性数组的预期⼤⼩

举例:

相关文章:

  • SYN Flood攻击:原理、危害与防御指南
  • 产品迭代与放弃的判断:MVP、PMF 与 Scale Fit 的三重验证
  • 开发者工具箱-鸿蒙金额转换开发笔记
  • (泛函分析)范数和收敛
  • LangChain
  • 讲述我的PLC自学之路 第九章
  • WHAT - 兆比特每秒 vs 兆字节每秒
  • 品鉴JS的魅力之防抖与节流【JS】
  • 2025年—ComfyUI_最新插件推荐及使用(实时更新)
  • 2942. 查找包含给定字符的单词
  • 【AI News | 20250523】每日AI进展
  • 文件夹图像批处理教程
  • NLP学习路线图(六):数据处理与可视化
  • Vue框架1(vue搭建方式1,vue指令,vue实例生命周期)
  • Symbol、Set 与 Map:新数据结构探秘
  • 关于gt的gt_data_valid_in信号
  • RV1126+FFMPEG多路码流监控项目大体讲解
  • 实现tdx-hs300-mcp
  • uni-app学习笔记十--vu3综合练习
  • 深入了解linux系统—— 操作系统的路径缓冲与链接机制
  • 做网站公司哪家正规/无锡网络推广外包
  • 网站选项按钮/哈尔滨百度搜索排名优化
  • 视频变成网站怎么做/百度招商加盟推广
  • 二手商标网/网络seo是什么
  • 奶茶加盟网站建设公司哪家好/seo门户网站优化
  • 华为手机开发者模式怎么关闭/文山seo公司