动态内存管理与柔性数组

使用python排八字 计算八字的相合相冲五行分值等 ... 简介 八字术是一种古老的算命术。它运用阴阳、五行、干支、八卦等理论,把人的出生年月日时转化为八个字,进而推算人的富贵贫贱、祸福吉凶、穷通寿天、名利地位、家庭六亲等方面的情况 八字源自古代的中国,是一种利用天干和地支来准确记录年、月、日、时的方式,由“年干,年支”、“月干,月支”、“日干,日支”、“时干,时支”,共八个干支所组成(共八个字),年、月、日、时... 阅读详情

目录

1.malloc函数

malloc函数的具体使用

2.calloc函数

2.calloc函数使用

3.realloc函数

realloc的使用

4.free函数

动态内存常见错误

1.对NULL指针的解引用操作

2.对动态开辟空间的越界访问

3.对非动态开辟内存使用free释放

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

5.重复释放

6.动态开辟内存忘记释放(内存泄漏)

柔性数组

柔性数组的特点

柔性数组好处


首先我们得知道关于动态开辟的一些函数,malloc,calloc,reallo,free这四个函数。

1.malloc函数

void* malloc(size_t size)

这个函数是向内存申请一块连续可用的空间,并返回指向这块空间的指针

如果开辟成功,则返回开辟空间的首地址

如果开辟失败,则返回NULL指针,所以malloc的返回值一定要检查

返回值是void*的类型,malloc函数并不知道要开辟的类型,所以需要使用时自己去定

如果参数size为0,malloc的行为是标准未定义的,取决于编译器

malloc函数的具体使用

#include<stdio.h>
#include<stdlib.h>
int main()
{
	int* p = (int*)malloc(40);//1
	if (p == NULL)//2
	{
		return 1;
	}
	free(p);//3
	return 0;
}

​

这段代码首先第一行(后面备注的1)开辟空间开辟40个字节并强转为int*赋给p,这里40,int*,都是可以改的,第一你想开辟多少个就多少个,并且想转化成什么类型的指针就什么类型

这段代码首先第二行(后面备注的2)这里的判断是非常必要的,这个上面也说了

这段代码首先第三行(后面备注的3)这里是释放内存,在后面会说

2.calloc函数

void* calloc(size_t num,size_t size)

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

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

2.calloc函数使用

#include<stdio.h>
#include<stdlib.h>
int main()
{
	int* p = (int*)calloc(10,4);
	if (p == NULL)
	{
		return 1;
	}
	free(p);
	return 0;
}

这个函数其实和malloc函数差不多,所以只要理解malloc函数就会了这个函数

3.realloc函数

realloc函数的出现让动态内存管理更加灵活

有时我们会发现过去申请的空间太小了,有时候我们又觉的申请的空间过大了,那为了合理的申请空间,我们一定会对内存大大小做灵活的调整,那realloc函数就可以做到对动态开辟内存大小的调整

函数原型

void* realloc(void* ptr,size_t size)

ptr是要调整的内存的大小

size是调整后的大小

返回值为调整后的内存的起始位置

realloc的使用

#include<stdio.h>
#include<stdlib.h>
int main()
{
	int* p = (int*)malloc(40);
	if (p == NULL)
	{
		return 1;
	}
	int* ptr = realloc(p, 80);
	if (ptr != NULL)
	{
		p = ptr;
	}
	free(p);
	return 0;
}

4.free函数

void  free(void* ptr)

这个函数可以说你用上面3个函数就要搭配这个函数

这个函数的作用是释放内存,当然这里的内存,是指动态开辟的内存,如果不释放就会造成内存泄漏,所以一定要释放。

这个函数的使用非常简单,就不多介绍了

动态内存常见错误

1.对NULL指针的解引用操作

void test()
{
	int* p = (int*)malloc(INT_MAX / 4);
	*p = 20;
	free(P);
}

这里p的值是NULL,就会存在问题

2.对动态开辟空间的越界访问

void test()
{
	int* p = (int*)malloc(40);
	if (p == NULL)
	{
		return 1;
	}
	for (int i = 0; i <= 10; i++)
	{
		*(p + i) = i;
	}
	free(p);
}

这里i=10,就越界访问

3.对非动态开辟内存使用free释放

void test()
{
	int a = 10;
	int* p = &a;
	free(p);
}

这里p不再是指向动态内存起始位置

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

void test()
{
	int* p = (int*)malloc(40);
	p++;
	free(P);
}

这里p不在指向开辟内存的起始位置,不能部分释放

5.重复释放

void test()
{
	int* p = (int*)malloc(40);
	free(p);
	free(P);
}

这里对p重复释放,这也是不行的

6.动态开辟内存忘记释放(内存泄漏)

int main()
{
	int* p = (int*)malloc(40);
	if (p == NULL)
	{
		return 1;
	}
	return 0;
}

这里没有对这样造成内存泄漏

这就是常见的六中错误

接下来要补充一个叫柔性数组

柔性数组

柔性数组这个东西也许你没听过,但它却是存在的,他是结构的最后的一个元素允许是未知大小的数组,这就柔性数组。

柔性数组的特点

1.结构体的柔性数组成员前面必须至少一个其他成员

2.sizeof返回的这种结构大小不包括柔性数组的内存

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

struct s1
{
	int num;
	int arr[];
};
struct s2
{
	int num;
	int arr[0];
};

柔性数组的二种写法,根据编译器的不同有可能有一种不行,但至少总有一种可以

柔性数组好处

柔性数组有二个好处

1.方便内存释放

2.这样有利访问速度

别再死记硬背了!用TwinCAT 3手把手教你配置EtherCAT伺服驱动的PDO映射(DS402协议) 本文详细介绍了如何使用TwinCAT 3配置EtherCAT伺服驱动的PDO映射(DS402协议),涵盖环境准备、设备扫描、PDO映射实战及高级技巧。通过具体操作步骤和常见问题排查,帮助工程师快速掌握EtherCAT通信配置,提升运动控制系统的效率和稳定性。 阅读详情

相关推荐

LabVIEW内存泄漏诊断与优化:从报错到高效运行

本文深入探讨LabVIEW内存泄漏的诊断与优化方法,从理解内存泄漏本质到使用专业工具链进行问题定位,再到高频场景的解决方案和高级优化策略。通过实战案例展示如何解决工业数据采集系统中的内存不足问题,帮助开发者提升LabVIEW应用的稳定性和效率。

moon9的博客 197

关于柔性数组

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33905756的博客 100

哨兵2号遥感影像解析全流程:步骤、算法与AI应用详解

未来,多源数据融合与边缘计算技术的应用将进一步拓展遥感解析的边界。波段合成:选择10m分辨率波段(如B2、B3、B4、B8)进行Layer Stacking,生成多光谱影像。| 分类与识别 | Scikit-Learn、PyTorch | SVM、CNN、K-Means聚类 | 地块分类、目标检测 || 数据预处理 | SNAP、Sen2Cor | 大气校正、几何校正 | L2A产品生成、格式转换 || 波段融合 | ENVI、GDAL | Layer Stacking、重采样 | 多光谱影像合成 |

zhz5214的博客 2711

动态内存管理+柔性数组

malloc我们打开C语言文档,注意这里不是官方文档​我们发现在C语言文档里面的语法结构是这个样子的void* malloc (size_t size);下面我会进行讲解从C语言的文档里面我们可以看见,头文件cstdlib这里定义了一个名为Student的结构体。结构体是一种复合数据类型,可以将不同类型的数据组合在一起。在Student结构体中有两个成员:int id:用于存储学生的编号,是一个整数类型。:用于存储学生的姓名,是一个长度为 20 的字符数组。

Jason_from_China的博客 1096

48V电气架构全面科普和解析:下一代智能电动汽车核心驱动

随着电动汽车(EV)技术的不断发展,传统的12V电力系统已经逐渐无法满足日益增长的功率需求,尤其是在电动汽车中,48V电气系统的引入成为了一种理想的解决方案。在电动汽车中,48V系统与Zonal架构的结合,不仅有效提升了车辆电力系统的能效,还为未来的技术升级提供了灵活的设计基础。随着电动汽车(EV)技术的发展,车辆电气系统的工作电压逐步从传统的12V系统向更高的电压过渡。随着电动汽车技术的不断进步,传统的12V电气系统逐渐无法满足现代高性能电动汽车的需求,而48V电力系统的引入成为一种理想的解决方案。

weixin_43199439的博客 7811

【华为OD技术面试手撕真题】25、验证IP地址 | 手撕真题+思路参考+代码解析(C & C++ & Java & Python & JS)

验证IP地址 华为od机试真题,华为OD技术二面,华为od机考,华为od手撕真题,华为od技术二面,华为od机试,华为OD机试的高频手撕代码题,华为od八股文

KJ.JK 4043

C语言之动态内存管理、柔性数组

本文讲述C语言动态内存管理的基础知识,另外包括柔性数组的基本知识。

x_p96484685433的博客 1014

stop pin/ignore pin/exclude pin/float pin

stop pin、ignore pin、exclude pin、float pin的区别

m0_61544122的博客 7289

C语言进阶-动态内存管理/柔性数组

动态内存管理的使用即注意事项有关于动态内存管理的寄到笔试题讲解柔性数组的使用为什么存在动态内存分配一般的开辟空间方式://在栈空间上开辟四个字节//在栈空间上开辟10个字节的连续空间特点:空间开辟大小是固定的(数组申明必须指定数组的长度,它所需要的内存在编译时分配)但有时候我们需要的空间大小在程序运行的时候才能知道, 那数组的编译时开辟空间的方式就不能满足了,由此动态内存开辟就来了动态内存函数的介绍。

~ 1779

【大模型学习】第二十四章 生成式人工智能(GAI)简介

‌的AI技术,其核心目标是通过学习数据中的规律,生成与训练数据类似但全新的文本、图像、音频、视频甚至代码。生成式人工智能(GAI)是一类能够‌。

以实战经验介绍行业知识 1637

fast-lio运行步骤(使用velodyne数据)

使用fast-lio运行velodyne数据

ericdowney 4769

[C语言]动态内存管理与柔性数组

Dynamic memory with flexible arrays

qq_66767938的博客 853

一文读懂 SAP ICF Services:从 SICF 激活到 ABAP OData V2/V4 安全与实战

本文系统化介绍了ABAP系统中ICF服务的关键概念及实践要点。主要内容包括:ICF服务的核心安全机制,需显式激活才能响应HTTP请求;在SICF中正确激活服务的操作步骤;OData V2/V4服务所需的不同ICF节点配置,如V4统一入口节点/sap/opu/odata4;典型问题如default_host未激活会导致HOST_INACTIVE错误;安全实践包括CSRF防护机制和权限对象(S_ICF_ADM)配置;以及实际案例分析和常见ICF服务节点的功能说明。文章为ABAP开发者与运维人员提供了ICF服务管

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 472

动态内存管理+柔性数组+经典笔试题

头文件均为stdlib.h忘记释放不再使用的动态开辟的空间会造成内存泄漏。切记:动态开辟的空间一定要释放,并且正确释放。只有当我们完全不再需要动态分配的内存时,才应该释放它,而且不要试图释放不属于我们的内存。

深入解析C/C++编程技巧,带你探索高效开发之路 1144

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

动态内存管理(续)+柔性数组

c语言

weixin_63451038的博客 1906

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

动态内存管理详解&柔性数组

本篇详细讲解了4个动态内存有关的函数:malloc、realloc、calloc和free。接着给出了一些常见的动态内存错误,然后给出了一些动态内存相关的问题巩固动态内存的知识。另外还科普了柔性数组的概念以及使用柔性数组的优势。

m0_74830524的博客 1326

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

动态内存管理及柔性数组

动态内存管理及柔性数组

m0_69005269的博客 218

重生之我在异世界学编程之C语言:深入动态内存管理收尾 + 柔性数组篇

本文是小编承接上一篇——《重生之我在异世界学编程之C语言:深入动态内存管理篇》所作的收尾和补充。有需要的宝子们就跟着小编的步伐一起进入本章知识的学习。Go!Go!Go!

z15879084549的博客 4239

C语言动态内存管理以及柔性数组

C语言动态内存管理以及柔性数组 动态内存函数的介绍 常见的动态内存错误 C/C++程序的内存开辟 柔性数组

qq_61635026的博客 732

(C语言)动态内存管理,柔性数组

size是要申请的字节数,这个函数最后回返回开辟这个空间的起始地址内存开辟失败返回空指针理解内存泄漏的概念:如果开辟一块空间,用完之后没有释放,即没有还给操作系统,其他的变量也用不了这块空间,就相当于这块空间丢了,这种情况就叫做内存泄漏int main()return 1;//返回1说明是异常返回i < 10;i++)i < 10;//free释放这块空间存放的东西,但是p指向的地址没有被释放p = NULL;//让p为空指针return 0;

2402_83411382的博客 1780

动态内存管理&柔性数组

但其有个缺点就是开辟大小固定;数组空间一旦确定了就不能调整。这就不得不提到动态内存的开辟了。

2402_87037360的博客 873

【C语言进阶】动态内存管理及柔性数组

本文讲解动态内存管理中malloc,calloc,realloc,free的功能和使用,以及我们在内存动态管理中常见的内存错误,还有柔性数组的特点,使用,和它的优势,分享出来,希望帮助大家。

m0_71659028的博客 3189

动态内存管理和柔性数组

如题

2401_88238436的博客 553

C语言动态内存管理+柔性数组

本文介绍了介绍了C语言动态内存分配的必要性和实现方法uzzyimg。主要内容包括:动态内存分配的必要性在于解决程序运行时才能确定空间需求的问题;malloc烯联free、calloc、realloc等动态内存分配函数的使用方法及注意事项;常见动态内存错误(如空指针解引用、越重访访问、多次释放等);;经典笔试题分析;以及柔性数组的概念、特性和使用优势。关键点在于强调动态内存分配提供了灵活的内存管理方式;同时必须注意内存泄漏和错误释放问题问题。

y3245239334的博客 1201

C语言动态内存管理和柔性数组

1.动态内存管理 为什么要存在动态内存分配? 有时候我们需要的空间大小在程序运行的时候才能知道, 那数组的编译时开辟空间的方式就不能满足了。 这时候就只能试试动态存开辟了。 1.1malloc malloc是C语言动态开辟空间的函数,但是没有初始化的功能 用一段代码来举例子 ptr = (int*)malloc(num*sizeof(int)); 这段代码的意思是给num开辟一个大小位num*int的一个空间,并且把其实地址赋值给指针ptr 详细解读一下 malloc(n.

qq_55546526的博客 625
上一篇: 内存操作函数memcpy函数,memmove函数,memcmp函数,memset函数
下一篇: 自定义类型结构体 枚举 联合
pythoncjavac++
博客等级 码龄5年 718粉丝 71原创
评论 13
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

pythoncjavac++

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值