news 2026/8/14 12:07:08

没有学不会的义务之动态内存管理

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
没有学不会的义务之动态内存管理

为什么要有动态内存管理:让程序员自己可以申请和释放空间(数组等开辟空间的大小是固定的)


内存中的不同区


malloc函数

功能:向内存的堆区申请一块连续可用的空间,并返回指向这块空间的起始地址。

1.如果开辟成功,则返回这块空间的起始地址

2.如果开辟失败,则返回一个NULL指针,因此malloc的返回值一定要做检查

3.返回值的类型是void*,所以malloc函数并不知道开辟空间的类型,具体在使用的时候使用者自己做决定(申请了一块地方,但不知道申请的额这块地方是放什么的,所以返回这块空间的起始地址)

4.如果参数size为0,malloc的行为标准是未定义的,取决于编译器(放0无意义)

需要的头文件stdlib.h

return 1表示malloc开辟失败,程序非正常结束,如果是正常结束,应该执行return0

free的使用格式

free是用来释放动态开辟的内存,free释放了空间,但是指针的值仍在,这是指针就变成了野指针,非常危险,所以需要手动将指针p=NULL(变长数组不能初始化)

calloc函数也用来动态内存分配

函数的功能是为num个大小为size的元素开辟一块空间,并且把空间的每个字节初始化为0

与函数malloc的区别在于calloc会在返回地址之前把申请的空间的每个字节初始化为全0

realloc函数

realloc函数的出现让动态内存管理变得更加灵活,realloc函数可以做到对动态开辟内存大小的调整

ptr是要调整的内存的地址;size是调整之后的新大小,单位是字节;返回值为调整之后内存的地址;若原来的空间后的位置已被分配(位置不够),则开辟新的一块空间,并且将旧的空间里的数据重新拷贝一份到新的空间中,返回新的空间的起始地址,释放掉旧的地址;反之则直接扩大原来空间后的位置,并不发生移动;

realloc函数也可以直接用来申请空间,等价于malloc

常见的动态内存的错误

1.对NULL的解引用:因为malloc函数会开辟失败,若不判断是否开辟成功就会出现问题。

2.对动态内存空间的越界访问:实际用的空间大于malloc申请的空间。

3.对非动态开辟内存使用free:如对数组进行free操作.

4.使用free释放动态开辟内存的一部分

free释放空间的时候一定要给这块空间的起始位置

5.对同一块动态内存多次释放:free了一块空间,在并没有给这块空间置为空的时候再次free

6.动态开辟内存忘记释放(谁申请的空间谁释放,不使用的空间及时释放,自己(函数1)不方便释放的空间,要告诉别人(函数2)释放)

题目分析

例题1

崩溃原因:1.str传递给Getmemory时使用的是值传递,形参变量p其实是str的一份拷贝,当我们把malloc申请的空间的起始地址存放在p中时不会修改str,str依然为空指针。所以当Getmemory函数返回后,再去调用strcpy函数需要将“hello world”拷贝到str指向的空间时,程序崩溃;2.因为malloc申请的空间没有free释放,存在内存泄漏

例题2

结果为随机值原因:数组p为局部变量,存放在栈区,出了作用域就销毁了也就意味着str不可以使用它(即使地址被传过去了)。返回栈空间的地址,当找这个地址时它却被销毁了。

修改这道题的方法,在char p【】前加上static,因为static修饰之后将数组存放在内存的静态区

柔性数组

c99中,结构中的最后一个元素允许是未知大小的数组,这就叫做柔性数组的成员

这样写有时候会报错,可以改成a【】

柔性数组的特点:1.结构体中的柔性数组成员前面必须至少有一个其他成员;2.sizeof返回的这种结构大小不包括柔性数组的内存;3.包含柔性数组的结构用malloc()函数进行内存的动态分配,并且分配的内存应该大于结构体的大小,以适应柔性数组的预期大小

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/14 15:56:06

网络套接字编程(UDP)

目录 一、预备知识 1.端口号的认识 1.1为什么需要端口号? 1.2 什么是端口号? 1.3 端口号的分类 1.4 端口号与IP地址的组合 2.TCP(传输控制协议) 2.1 核心特点 2.2 典型应用 3. UDP(用户数据报协议&#xff0…

作者头像 李华
网站建设 2026/7/14 15:56:05

钉钉机器人安全配置全攻略:从IP白名单到关键词过滤的避坑指南

钉钉机器人安全配置实战:从零构建企业级自动化通知防线 在数字化办公成为常态的今天,钉钉机器人早已超越了简单的“消息推送器”角色,成为了连接业务系统与团队协作的关键枢纽。无论是监控告警、数据同步、流程审批,还是日常的自动…

作者头像 李华
网站建设 2026/7/14 15:56:05

AI专著写作利器大集合,从构思到完稿,全程高效搞定

学术专著的活力在于逻辑的严谨性,然而逻辑论证却是写作过程中最容易出现问题的环节。对于专著来说,围绕核心观点进行系统性论证至关重要。这不仅要求对每一论点进行深入阐释,还需评估不同学派的对立观点,并确保整个理论框架的一致…

作者头像 李华
网站建设 2026/7/14 15:56:21

Emilia数据集:6种语言10万小时语音生成技术的突破与应用

1. Emilia数据集:一个改变游戏规则的多语言语音宝库 如果你最近在关注语音合成(TTS)或者语音生成领域,那你大概率已经听过“Emilia”这个名字了。它就像一个突然出现在舞台中央的超级新星,让整个圈子都兴奋了起来。简…

作者头像 李华
网站建设 2026/7/14 15:56:20

创意无限:用圣女司幼幽-造相Z-Turbo为游戏设计古风角色概念图

创意无限:用圣女司幼幽-造相Z-Turbo为游戏设计古风角色概念图 1. 从灵感到画面:为什么游戏设计需要它? 想象一下这个场景:你的游戏策划案里有一个核心角色——一位来自东方玄幻世界的圣女。文字描述很精彩:“她身着墨…

作者头像 李华