为什么要有动态内存分配

        我们在学习动态内存管理之前,一直都是通过开辟变量,或者是开辟数组的方式来在内存的栈区开辟空间的,但是这样的开辟方式有局限性,因为一旦开辟之后,它们的大小就无法改变,就缺少了很多的灵活性,但是动态内存管理就可以帮助我们解决这个问题,它是在堆区开辟空间的,并且它所开辟的空间是可大可小的。

动态内存开辟四大函数

        其实想要动态开辟内存空间非常的简单,我们只需要学会内存开辟四大函数就可以了。

        malloc和free

        malloc函数就是用来在内存的堆区开辟空间的,它的函数定义如下。

   void* malloc (size_t size);

   函数的形参表示所要开辟空间的字节大小,你想要开辟几个字节的空间,就给形参什么值,malloc函数是在堆区开辟的一块连续的空间,一旦开辟了空间,我们想要找到这块空间,就势必要只要它的起始地址值,而malloc函数的返回值就是这个作用,它返回的是开辟空间的起始地址,那为什么是void*类型的指针呢?原因就是我在开辟的时候,我也不知道要往这块空间里边存放什么类型的数据,或者说什么类型的数据都可以存放在我这块空间里边,所以一开始就给它返回的是void*类型的指针。还有一个值得注意的点就是malloc开辟空间如果失败的话,就会返回NULL值,所以我们需要对返回值进行判断。

        malloc函数的使用举例

#include<stdio.h>
#include<stdlib.h>//四大内存开辟函数都需要包含这个头文件int main()
{//假设现在我想要开辟40个字节的空间,并且像里边存放整型数据int* pi = (int*)malloc(40);//判断是否开辟成功//为NULL就代表开辟空间失败,perror打印开辟失败的原因//返回非0的值,C语言里边返回非0的值表示异常结束if (pi == NULL){perror("malloc");return 1;}//开辟成功,可以向这块空间里边存值for (int i = 0; i < 10; i++){*(pi + i) = i + 1;//存入1~10的值}//打印for (int i = 0; i < 10; i++){printf("%d ", *(pi + i));}return 0;
}

        由上边的代码跟运行结果来看,好像似乎并没有什么问题,但malloc毕竟是动态开辟的空间,开辟了空间难道就不用回收的吗?答案是要回收的,上边的代码好像并没有回收,那怎么也可以运行呢,原因是当程序结束的时候,操作系统会自动帮你回收,不过如果日后的代码过长,或者是程序是一个7*24小时不停歇的运转的话,如果我们不主动回收,就会出现内存泄露的问题,所以如果这块动态开辟的内存你不再想要使用的时候,就请主动回收掉,free函数就是用来主动回收的。

        free:

   它的函数定义如下

   void free (void* ptr);

   它的形参的指针就指向的是动态开辟的起始地址的位置,如果给它传NULL,那么这个函数将什么都不会做。

   接下来我们对刚才的代码做一个完善   

        由图可见,释放代码其实就两行,但是至关重要。

        大家可能会有疑惑,释放完了空间之后,为什么还要将pi赋值为NULL指针,原因是因为刚才的pi指针接收了malloc动态开辟的空间,但是当free之后,刚才申请的那块空间已经被释放了,里边的数据也已经不是刚才存进去的数据了,而此时pi指针里边仍存放着那块空间的地址,这就形成了野指针,所以给它赋值为NULL。

        calloc和realloc

        calloc函数也是用来动态内存开辟空间的函数,它的函数定义如下

   void* calloc (size_t num,size_t size);

   函数的形参的意思就是为num个大小为size的元素开辟空间,并且calloc函数会把开辟的空间的每个字节都初始化为0。

        calloc函数的使用举例

#include<stdio.h>
#include<stdlib.h>
int main()
{//给10个大小为int类型的数据开辟空间//用malloc函数就相当于//malloc(10 * sizeof(int));int* pi = (int*)calloc(10, sizeof(int));if (pi == NULL){perror("calloc");return 1;}//开辟成功,使用//calloc会自动的给申请的空间初始化为0for (int i = 0; i < 10; i++){printf("%d ", *(pi + i));}//释放free(pi);pi = NULL;return 0;
}

        realloc函数是用来对我们动态申请的内存进行调整的。它的函数定义如下。

   void* realloc (void* ptr , size_t size);

   ptr是要调整空间内存的起始地址。size为调整之后的新大小。返回值为调整后的内存的起始位置。

        对于realloc函数的重新调整空间大小,总共有三种情况。

        情况1:原有空间之后有足够的空间。

        情况2:原有的空间之后没有足够的空间。

        情况3:重新调整空间失败,返回NULL指针。

        realloc函数的使用举例

#include<stdio.h>
#include<stdlib.h>
int main()
{//申请空间int* pi = (int*)malloc(40);if (pi == NULL){perror("malloc");return 1;}//使用空间for (int i = 0; i < 10; i++){*(pi + i) = i++;}for (int i = 0; i < 10; i++){printf("%d ", *(pi + i));}//内存不够,重新调整//注意,这个返回值不能用刚才的pi来接收,因为可能开辟空间失败返回NULL,这样就导致原来开辟的空间也找不到了。int* ptr = (int*)realloc(pi, 80);if (ptr == NULL){perror("realloc");return 1;}else//开辟成功{pi = ptr;ptr = NULL;}//继续使用........//释放空间free(pi);pi = NULL;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/914941.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/914941.shtml
英文地址,请注明出处:http://en.pswp.cn/news/914941.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++标准库(std)详解

C标准库&#xff08;std&#xff09;详解——目录C标准库&#xff08;std&#xff09;详解一、命名空间&#xff08;namespace&#xff09;二、主要组件1. 输入输出流&#xff08;<iostream>&#xff09;2. 字符串处理&#xff08;<string>&#xff09;3. STL容器&…

ESP32的OTA升级详解:3. 搭建node/python服务器升级(native ota原生API)

一、OTA两种方式&#xff1a;app_update 与 esp_https_ota 区别 ESP32/ESP32-S2/ESP32-C3等可通过Wi-Fi或以太网下载新固件到OTA分区实现运行时升级。ESP-IDF提供两种OTA升级方法&#xff1a; 使用app_update组件的原生API使用esp_https_ota组件的简化API(支持HTTPS升级) 本次…

byte[]作为接口参数传递的方法

在C#中通过WebService或API传递byte参数&#xff08;如文件、图像等二进制数据&#xff09;时&#xff0c;通常有以下几种实现方式&#xff1a; ‌1. 使用Base64编码&#xff08;推荐REST API&#xff09;‌ 将byte数组转换为Base64字符串传输&#xff0c;适用于JSON格式的API&…

元宇宙与Web3的深度融合:构建沉浸式数字体验的愿景与挑战

一、技术特征与融合基础1. 元宇宙的技术架构&#xff08;2025年&#xff09;空间构建技术&#xff1a;3D建模与渲染&#xff1a;实时渲染引擎&#xff08;如Unity HDRP&#xff09;支持路径追踪光追&#xff0c;AI生成模型&#xff08;NVIDIA Get3D&#xff09;3秒生成3D场景。…

什么是脑裂

脑裂定义&#xff1a; 脑裂是分布式系统中由于网络分区&#xff08;Network Partition&#xff09;导致集群节点被分割成多个独立子集&#xff0c;每个子集认为自己是唯一合法的集群&#xff0c;从而导致数据不一致或系统行为异常的现象。详细工作原理&#xff1a;发生原因&…

川翔云电脑:云端算力新标杆,创作自由无边界

一、旗舰机型&#xff1a;4090Ultra 48G 显存颠覆硬件限制 川翔云电脑最新上线的RTX 4090Ultra 48G 显存机型&#xff0c;采用 NVIDIA Ada Lovelace 架构&#xff0c;单卡显存容量达 48GB GDDR6X&#xff0c;较传统 4090 翻倍&#xff0c;可直接加载 1200 万面数的超复杂模型&a…

贪心算法(排序)

码蹄集OJ-活动安排 #include<bits/stdc.h> using namespace std; struct MOOE {int s,e; }; bool compare(const MOOE&a,const MOOE&b) {return a.e<b.e; } int main( ) {int n;cin>>n;vector<MOOE>a(n);for(int i0;i<n;i){cin>>a[i].…

详解序数回归损失函数ordinal_regression_loss:原理与实现

在医疗 AI 领域&#xff0c;很多分类任务具有有序类别的特性&#xff0c;如疾病严重程度&#xff08;轻度→中度→重度&#xff09;、肿瘤分级&#xff08;G1→G2→G3&#xff09;等。这类任务被称为序数回归&#xff08;Ordinal Regression&#xff09;&#xff0c;需要特殊的…

SQL增查

建完库与建完表后后:1.分别查询student表和score表的所有记录student表&#xff1a;score表:2.查询student表的第2条到5条记录SELECT * FROM student LIMIT 1,4;3.从student表中查询计算机系和英语系的学生的信息SELECT * FROM student-> WHERE department IN (计算机系, 英…

二分答案之最大化最小值

参考资料来源灵神在力扣所发的题单&#xff0c;仅供分享学习笔记和记录&#xff0c;无商业用途。 核心思路&#xff1a;本质上是求最大 应用场景&#xff1a;在满足条件的最小值区间内使最大化 检查函数&#xff1a;保证数据都要大于等于答案 补充&#xff1a;为什么需要满…

OCR 赋能档案数字化:让沉睡的档案 “活” 起来

添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09;企业产品档案包含设计图纸、检测报告、生产记录等&#xff0c;传统数字化仅靠扫描存档&#xff0c;后续检索需人工逐份翻阅&#xff0c;效率极低。​OCR 产品档案解决方案直击痛点&#xff1a;通过智能识别技…

力扣118.杨辉三角

思路1.新建一个vector的vector2.先把空间开出来&#xff0c;然后再把里面的值给一个个修改开空间的手段&#xff1a;new、构造函数、reserve、resize因为我们之后要修改里面的数据&#xff0c;这就意味着我们需要去读取这个数据并修改&#xff0c;如果用reserve的话&#xff0c…

Python 网络爬虫 —— 提交信息到网页

一、模块核心逻辑“提交信息到网页” 是网络交互关键环节&#xff0c;借助 requests 库的 post() 函数&#xff0c;能模拟浏览器向网页发数据&#xff08;如表单、文件 &#xff09;&#xff0c;实现信息上传&#xff0c;让我们能与网页背后的服务器 “沟通”&#xff0c;像改密…

SpringMVC4

一、SpringMVC 注解与项目开发流程1.1注解的生命周期- Target、Retention 等元注解&#xff1a;- Target(ElementType.TYPE) &#xff1a;说明这个注解只能用在类、接口上。- Retention(RetentionPolicy.RUNTIME) &#xff1a;说明注解在运行时保留&#xff0c;能通过反射获取…

数据结构排序算法总结(C语言实现)

以下是常见排序算法的总结及C语言实现&#xff0c;包含时间复杂度、空间复杂度和稳定性分析&#xff1a;1. 冒泡排序 (Bubble Sort)思想&#xff1a;重复比较相邻元素&#xff0c;将较大元素向后移动。 时间复杂度&#xff1a;O(n)&#xff08;最好O(n)&#xff0c;最坏O(n)) 空…

嵌入式学习-PyTorch(2)-day19

很久没有学了&#xff0c;期间打点滴打了一个多星期&#xff0c;太累了&#xff0c;再加上学了一下Python语法基础&#xff0c;再终于开始重新学习pytorchtensorboard 的使用import torch from torch.utils.tensorboard import SummaryWriter writer SummaryWriter("logs…

Prompt Engineering 快速入门+实战案例

资料来源&#xff1a;火山引擎-开发者社区 引言 什么是 prompt A prompt is an input to a Generative AI model, that is used to guide its output. Prompt engineering is the process of writing effective instructions for a model, such that it consistently generat…

「源力觉醒 创作者计划」_文心开源模型(ERNIE-4.5-VL-28B-A3B-PT)使用心得

文章目录背景操作流程开源模型选择算力服务器平台开通部署一个算力服务器登录GPU算力服务器进行模型的部署FastDeploy 快速部署服务安装paddlepaddle-gpu1. 降级冲突的库版本安装fastdeploy直接部署模型&#xff08;此处大约花费15分钟时间&#xff09;放行服务端口供公网访问最…

P10719 [GESP202406 五级] 黑白格

题目传送门 前言&#xff1a;不是这样例有点过分了哈&#xff1a; 这是我没考虑到无解的情况的得分&#xff1a; 这是我考虑了的得分&#xff1a; 总而言之&#xff0c;就是一个Subtask 你没考虑无解的情况&#xff08;除了Subtask #0&#xff09;,就会WA一大片,然后这个Subt…

AWS RDS PostgreSQL可观测性最佳实践

AWS RDS PostgreSQL 介绍AWS RDS PostgreSQL 是亚马逊云服务&#xff08;AWS&#xff09;提供的托管型 PostgreSQL 数据库服务。托管服务&#xff1a;AWS 管理数据库的底层基础设施&#xff0c;包括硬件、操作系统、数据库引擎等&#xff0c;用户无需自行维护。高性能&#xff…