| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> C++知识库 -> C语言动态内存管理和柔性数组 -> 正文阅读 |
|
[C++知识库]C语言动态内存管理和柔性数组 |
1.动态内存管理为什么要存在动态内存分配?
有时候我们需要的空间大小在程序运行的时候才能知道, 那数组的编译时开辟空间的方式就不能满足了。 这时候就只能试试动态存开辟了。
1.1mallocmalloc是C语言动态开辟空间的函数,但是没有初始化的功能 ? 用一段代码来举例子
这段代码的意思是给num开辟一个大小位num*int的一个空间,并且把其实地址赋值给指针ptr 详细解读一下 malloc(num*sizeof(int))这里就让malloc开辟一个num*sizeof(int)的空间,num*sizeof(int)相当于函数的形参传进去,然后调用malloc函数,开辟一个大小为num*sizeof(int)的空间,又因为malloc函数内部是void*类型的返回值,所以我们要强转成int*类型的,才可以让ptr来接收,所以要再malloc前面加上内存强转的符号,如果开辟失败,函数会返回一个NULL,所以我们想要知道是否开辟成功,可以加个if判断ptr是否为空指针 1.2free
这个代码就是把ptr指向的那一段空间释放掉,ptr必须是放在堆区的空间,也就是动态开辟的空间。如果不是动态内存开辟的空间会释放失败,函数的返回值会变成NULL,所以我们想要判断释放是否成功,可以加一个if判断 1.3calloccalloc的作用和malloc差不多,但是多了一个初始化的功能 ?这里可以看到calloc的参数中多了一个size_t num这个就是要开辟的元素个数,size_t是要开辟的元素大小可以举个例子
这次调用和上面的malloc一个意思,所以就不解读了,calloc函数有一个比较好的功能,就是可以把开辟的空间全部初始化成0,也是和malloc函数不同的地方 1.4recollocrecolloc函数是用来对开辟过的内存空间进行大小修改的,如果想要扩容,可以使用这个函数 ? 这里的两个参数,分别是需要更改的地址,和需要修改的大小,举个例子 ?
这里我们就给ptr增加了2个字节的空间,用法基本和malloc差不多 注意:我们在使用动态内存管理函数的时候,用完一定不能忘记free掉,因为在大程序中,很可能会导致死机 2.柔性数组
也许你从来没有听说过
柔性数组(
flexible array
)
这个概念,但是它确实是存在的。
C99
中,结构中的最后一个元素允许是未知大小的数组,这就叫做『柔性数组』成员。
柔性数组有两种写法,因为有的编译器只支持其中的一种,所以我们要看情况使用
柔性数组的特点:
1.结构中的柔性数组成员前面必须至少一个其他成员。
2.sizeof
返回的这种结构大小不包括柔性数组的内存。
3.包含柔性数组成员的结构用
malloc ()
函数进行内存的动态分配,并且分配的内存应该大于结构的大 小,以适应柔性数组的预期大小
柔性数组的使用
这样相当于给了数组100个整型元素的空间 柔性数组的优势: 肯定有很多人说这样的代码,我们使用malloc来申请,一样可以达到相应的效果,但是我们值得注意的是1.柔性数组里面开辟的空间是连续的,从某种程度上来说,节省了内存的琐碎空间,并且让我们的程序效率提高,这个学了计算机组成原理应该很好理解? ? ? ?2.柔性数组也比较容易释放,只需要free一次即可,如果我们使用malloc,肯定是要free两次的,直接说太抽象了,上代码
这就是用malloc来实现柔性数组的功能,书不是显得有点冗余,并且释放的时候需要free两次,所以肯定没有柔性数组有优势的 |
|
C++知识库 最新文章 |
【C++】友元、嵌套类、异常、RTTI、类型转换 |
通讯录的思路与实现(C语言) |
C++PrimerPlus 第七章 函数-C++的编程模块( |
Problem C: 算法9-9~9-12:平衡二叉树的基本 |
MSVC C++ UTF-8编程 |
C++进阶 多态原理 |
简单string类c++实现 |
我的年度总结 |
【C语言】以深厚地基筑伟岸高楼-基础篇(六 |
c语言常见错误合集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 0:00:34- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |