IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: 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.1malloc

malloc是C语言动态开辟空间的函数,但是没有初始化的功能

?

用一段代码来举例子


 ptr = (int*)malloc(num*sizeof(int));

这段代码的意思是给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

free(ptr);

这个代码就是把ptr指向的那一段空间释放掉,ptr必须是放在堆区的空间,也就是动态开辟的空间。如果不是动态内存开辟的空间会释放失败,函数的返回值会变成NULL,所以我们想要判断释放是否成功,可以加一个if判断

1.3calloc

calloc的作用和malloc差不多,但是多了一个初始化的功能

?这里可以看到calloc的参数中多了一个size_t num这个就是要开辟的元素个数,size_t是要开辟的元素大小可以举个例子

ptr = (int*)calloc(num,sizeof(int));

这次调用和上面的malloc一个意思,所以就不解读了,calloc函数有一个比较好的功能,就是可以把开辟的空间全部初始化成0,也是和malloc函数不同的地方

1.4recolloc

recolloc函数是用来对开辟过的内存空间进行大小修改的,如果想要扩容,可以使用这个函数

?

这里的两个参数,分别是需要更改的地址,和需要修改的大小,举个例子

?

ptr = (int*)calloc(num,sizeof(int));
ptr = (int*)recolloc(ptr,num*sizeof(int)+2);

这里我们就给ptr增加了2个字节的空间,用法基本和malloc差不多

注意:我们在使用动态内存管理函数的时候,用完一定不能忘记free掉,因为在大程序中,很可能会导致死机

2.柔性数组

也许你从来没有听说过 柔性数组( flexible array 这个概念,但是它确实是存在的。
C99 中,结构中的最后一个元素允许是未知大小的数组,这就叫做『柔性数组』成员。

柔性数组有两种写法,因为有的编译器只支持其中的一种,所以我们要看情况使用

typedef struct st_type
{
 int i;
 int a[0];//柔性数组成员
}type_a;
typedef struct st_type
{
 int i;
 int a[];//柔性数组成员
}type_a;

柔性数组的特点:

1.结构中的柔性数组成员前面必须至少一个其他成员。
2.sizeof 返回的这种结构大小不包括柔性数组的内存。
3.包含柔性数组成员的结构用 malloc () 函数进行内存的动态分配,并且分配的内存应该大于结构的大 小,以适应柔性数组的预期大小
柔性数组的使用
int i = 0;
type_a *p = (type_a*)malloc(sizeof(type_a)+100*sizeof(int));

这样相当于给了数组100个整型元素的空间

柔性数组的优势:

肯定有很多人说这样的代码,我们使用malloc来申请,一样可以达到相应的效果,但是我们值得注意的是1.柔性数组里面开辟的空间是连续的,从某种程度上来说,节省了内存的琐碎空间,并且让我们的程序效率提高,这个学了计算机组成原理应该很好理解? ? ? ?2.柔性数组也比较容易释放,只需要free一次即可,如果我们使用malloc,肯定是要free两次的,直接说太抽象了,上代码

struct a
{
int i;
int a[];
}


struct* ptr = (struct*)malloc(struct);
ptr->a[] = (int*)malloc(100*sizeof(int));

这就是用malloc来实现柔性数组的功能,书不是显得有点冗余,并且释放的时候需要free两次,所以肯定没有柔性数组有优势的

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-04-06 15:59:31  更:2022-04-06 16:02:36 
 
开发: 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-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码