【C语言学习——————动态内存管理】

news2024/9/27 19:15:11

文章目录

  • 一、什么是动态内存管理
  • 二、动态内存函数的介绍
    • 1.malloc函数的介绍
    • 2.calloc函数的介绍
    • 3.realloc函数的介绍
  • 三、free函数的介绍

一.什么是动态内存管理

我们知道数据都是在内存中进行储存的,但是如果我们需要调用内存,我们可以通过定义一个变量向内存中申请空间,例如

int a = 0;

int arr[10] = { 0 };

诸如此类的都是通过定义的形式对空间进行开辟。

但是这种调用内存的方式会存在一定的缺陷

1.他们所开辟的大小都是固定的

2.数组在定义申明的时候,必须要指定数组的长度大小,有的时候我们需要的空间大小在程序运行之后才能知道。

所以,动态内存管理的作用就很明确了,是通过一个动态内存函数来对空间进行开辟,从而达到我们想要的一个效果。


二. 动态内存函数的介绍

动态内存函数在使用之前需要引用头文件 #include <stdlib>

1.malloc函数的介绍

malloc函数的一般形式是 void* malloc (size_t size);

void* 是malloc的类型,一般情况下需要对malloc进行强制转换操作,例如(int *)malloc等。

它的作用是向内存中开辟一块内存块,并且返回给一个指向内存空间的指针。

需要注意的是,如果开辟成功的话,则会返回一个指向内存空间的指针。

若是开辟失败的话则会返回一个NULL指针,所以需要对malloc的返回值进行检查

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

我们通常可以这样来使用malloc.

int main()
{
    int* p = (int*)malloc(40);//开辟一块大小为40个字节的空间
    if(p == NULL)//对返回值进行检查.
    {
        perror("malloc");
        return 1;
    }
    return 0;
}

这个程序可以理解为int p[10] = { 0 };但是malloc在开辟完空间之后,是不会对内存进行初始化的,会保留一个不确定的值。

2.calloc函数的介绍

calloc的用法和malloc大体相似,但也有些不同。

它的基本形式是void* calloc (size_t num, size_t size);在这里,num是需要分配的元素的大小。size是元素本身的字节大小。

其次,calloc的返回值同样需要检查。

若开辟成功则会返回一个指向空间的指针。

若是开辟失败,则会返回一个NULL指针。

若为0,则返回值就取决于特定的库实现(它可能是也不是空指针),但是返回的指针不应该被取消引用。

通常对calloc的使用格式如下:

int main()
{
    int* p = (int*)calloc(10, sizeof(int));//开辟一块大小为40字节的空间
    if(p == NULL)//对返回值进行检查
    {
        perrpr("calloc");
        return 1;
    }
    return 0;
}

同样和malloc一样是对内存空间进行开辟,但是calloc在开辟内存空间的时候会对内存空间进行初始化操作。

3.realloc函数的介绍

realloc函数是对内存大小进行重新分配,通常会用于扩容或者是缩进内存空间大小。

realloc的基本形式是void* realloc (void* ptr, size_t size);

这里的ptr是指向需要进行操作的空间的一个指针,类型是根据指针的类型来变化的,size是变化后的空间大小,这里尤其需要注意,并不是需要扩容/缩进的大小,而是扩容/缩进之后的整个空间的大小。

realloc在调整原空间大小的基础上,还会将原来的内存中的数据移动到新的空间。

并且,realloc在调整内存空间上存在两种情况:

1.原有空间之后拥有足够大的空间

若原有空间后拥有足够大的空间,则realloc函数会直接在该空间的后面进行开辟。

2.原有空间之后的空间不足

若原有空间后拥有的空间不足以进行调整,则realloc函数会通过重新开辟一块空间并调整为新的大小,然后通过将原空间内的数据进行拷贝到新的空间内,其次会对旧的空间进行释放,最后会返回一个新的空间地址。

我们通过一个案例来说明一下:

int main()
{
    int* p = (int*)malloc(40);
    if(p == NULL)
    {
        perror("malloc");
        return 1;
    }
    p = realloc(p, 80);
    return 0;
}

调整前的空间的地址

调整后的空间的地址

 通过以上的对比我们可以了解到空间不足的情况下确实会重新开辟一块空间来进行对内存空间大小的调整。

三.free函数的介绍

在使用free函数前,同样需要引用头文件#include <stdlib.h>

我们通过定义变量对内存进行开辟的方式称为静态开辟内存空间,而我们通过静态开辟的内存会由系统自动进行释放。

但是动态开辟的内存,malloc和calloc开辟的内存空间并不会由系统主动释放,若我们不通过主动释放的话,这块空间很有可能会导致内存泄漏等问题,所以在结束对内存的动态开放之后,我们需要主动对动态开辟的内存空间进行释放。

在这里就需要引进free函数。free函数就是用于释放我们动态开辟的空间。

 它的用法也非常的简单,它的参数就是指向我们动态开辟的空间的那个指针。

例:

int main 
{
    int* p = (int*)malloc(40);
    if(p == NULL)
    {
        perror("malloc");
        return 1;
    }
    free(p);
    p = NULL;//需要将指针设置为空指针
    return 0;
}

注意在对内存空间进行free后,需要将指针的大小置为NULL,防止野指针的产生。

同样,如果指针指向的空间并不是动态开辟的,则free函数的行为是未定义的。free函数只针对动态开辟的空间,对于静态开辟的内存空间,free函数的行为是未定义的。

如果ptr的值为NULL的话,则free函数什么也不会做。


 以上就是对动态开辟内存空间的介绍,如果该文对你有帮助的话不要忘记点赞+关注三连一下,欢迎各位佬的关注与支持,顺着网线回去三连!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

实现哈希表

一&#xff1a;什么是哈希表&#xff1f; 哈希表是一种常见的数据结构&#xff0c;它通过将键映射到值的方式来存储和组织数据。具体来说&#xff0c;哈希表使用哈希函数将每个键映射到一个索引&#xff08;在数组中的位置&#xff09;&#xff0c;然后将该键值对存储在该索引处…

IOS + Appium自动化教程

前言 项目闲置下来了&#xff0c;终于抽空有时间搞自动化了&#xff0c;看了下网上的教程基本通篇都是android自动化的介绍 &#xff0c;ios自动化方面的内容网上简介的少之可怜。由于本人对ios自动化也是第一次做&#xff0c;甚至对苹果电脑的使用都不太熟悉&#xff0c;花了大…

微信小程序,商城底部工具栏的实现

效果演示&#xff1a; 前提条件&#xff1a; 去阿里云矢量图标&#xff0c;下载8个图标&#xff0c;四个黑&#xff0c;四个红&#xff0c;如图&#xff1a; 新建文件夹icons&#xff0c;把图标放到该文件夹&#xff0c;然后把该文件夹移动到该项目的文件夹里面。如图所示 app…

vue3如何封装接口

&#x1f642;博主&#xff1a;锅盖哒 &#x1f642;文章核心&#xff1a;如何封装接口 目录 前言 1.首先&#xff0c;安装并导入axios库。你可以使用npm或yarn来安装&#xff1a; 2.创建一个api.js文件来管理接口封装&#xff1a; 3.在Vue组件中使用封装的接口&#xff1…

【雕爷学编程】MicroPython动手做(02)——尝试搭建K210开发板的IDE环境4

7、使用串口工具 &#xff08;1&#xff09;连接硬件 连接 Type C 线&#xff0c; 一端电脑一端开发板 查看设备是否已经正确识别&#xff1a; 在 Windows 下可以打开设备管理器来查看 如果没有发现设备&#xff0c; 需要确认有没有装驱动以及接触是否良好 &#xff08;2&a…

Ubuntu更改虚拟机网段(改成桥接模式无法连接网络)

因为工作需要&#xff0c;一开始在安装vmware和虚拟机时&#xff0c;是用的Nat网络。 现在需要修改虚拟机网段&#xff0c;把ip设置成和Windows端同一网段&#xff0c;我们就要去使用桥接模式。 环境&#xff1a; Windows10、Ubuntu20.04虚拟机编辑里打开虚拟网络编辑器&#…

安装Harbor

前言 Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器&#xff0c;虽然Docker官方也提供了公共的镜像仓库&#xff0c;但是从安全和效率等方面考虑&#xff0c;部署企业内部的私有环境Registry是非常必要的&#xff0c;Harbor和docker中央仓库的关系&#xff0c;…

第四章:Spring上

第四章&#xff1a;Spring上 4.1&#xff1a;Spring简介 Spring概述 官网地址&#xff1a;https://spring.io/。 Spring是最受欢迎的企业级的java应用程序开发框架&#xff0c;数以百万的来自世界各地的开发人员使用Spring框架来创建性能好、易于测试、可重用的代码。Spring框…

【多模态】18、ViLD | 通过对视觉和语言知识蒸馏来实现开集目标检测(ICLR2022)

文章目录 一、背景二、方法2.1 对新类别的定位 Localization2.2 使用 cropped regions 进行开放词汇检测2.3 ViLD 三、效果 论文&#xff1a;Open-vocabulary Object Detection via Vision and Language Knowledge Distillation 代码&#xff1a;https://github.com/tensorflo…

Verilog语法学习——LV10_使用函数实现数据大小端转换

LV10_使用函数实现数据大小端转换 题目来源于牛客网 [牛客网在线编程_Verilog篇_Verilog快速入门 (nowcoder.com)](https://www.nowcoder.com/exam/oj?page1&tabVerilog篇&topicId301) 题目 描述 在数字芯片设计中&#xff0c;经常把实现特定功能的模块编写成函数&…

HBuilder 编辑器终端窗口无法输入,未响应的解决方案

HBuilder 编辑器终端窗口无法输入&#xff0c;未响应的解决方案 一、找到 HBuilder 安装目录 找到 main.js HBuilderX - plugins - builtincef3terminal - script - main.js 二、编辑 main.js 将 main.js 文件中的 powershell.exe 和 cmd.exe 路径都改为绝对路径 C:/Windows…

【渗透测试】漏洞扫描AWVS安装使用教程,三分钟手把手教会,非常简单

一、AWS简介 Acunetix Web Vulnerability Scanner(简称AWVS)是一个自动化的Web漏洞扫描工具&#xff0c;它可以扫描任何通过Web浏览器访问和遵循HITP/HTTPS规则的Web站点。 AWVS原理是基于漏洞匹配方法&#xff0c;通过网络爬虫测试你的网站安全&#xff0c;检测流行安全AWVS可…

Hadoop学习日记-YARN组件

YARN(Yet Another Resource Negotiator)作为一种新的Hadoop资源管理器&#xff0c;是另一种资源协调者。 YARN是一个通用的资源管理系统和调度平台&#xff0c;可为上层应用提供统一的资源管理和调度 YARN架构图 YARN3大组件&#xff1a; &#xff08;物理层面&#xff09…

Spring学习笔记,包含Spring IOC、AOP基本原理、Bean管理、Spring 事务等等

&#x1f600;&#x1f600;&#x1f600;创作不易&#xff0c;各位看官点赞收藏. 文章目录 Spring 基础笔记1、控制反转 (IOC)1.1、IOC 底层原理1.2、IOC 之Bean管理 ( XML )1.3、IOC 之Bean管理 (FactoryBean)1.4、Bean的作用域1.5、Bean的生命周期1.6、Bean的自动装配1.7、I…

SFP6002-ASEMI代理海矽美快恢复二极管参数、尺寸、规格

编辑&#xff1a;ll SFP6002-ASEMI代理海矽美快恢复二极管参数、尺寸、规格 型号&#xff1a;SFP6002 品牌&#xff1a;ASEMI 封装&#xff1a;TO-247AB 恢复时间&#xff1a;30ns 正向电流&#xff1a;60A 反向耐压&#xff1a;200V 芯片大小&#xff1a;102MIL*2 芯…

几个影响 cpu cache 性能因素及 cache 测试工具介绍

》内核新视界文章汇总《 文章目录 1 cache 性能及影响因素1.1 内存访问和性能比较1.2 cache line 对性能的影响1.3 L1 和 L2 缓存大小1.4 指令集并行性对 cache 性能的影响1.5 缓存关联性对 cache 的影响1.6 错误的 cacheline 共享 (缓存一致性)1.7 硬件设计 2 cpu cache benc…

【EI/SCOPUS会议征稿】第四届机器学习与计算机应用国际学术会议(ICMLCA 2023)

ICMLCA 2023 第四届机器学习与计算机应用国际学术会议 2023 4th International Conference on Machine Learning and Computer Application 第四届机器学习与计算机应用国际学术会议(ICMLCA 2023)定于2023年10月27-29日在中国杭州隆重举行。本届会议将主要关注机器学习和计算…

rk3568 Debian11 如何打开热点

思路&#xff1a;1. 下载必要工具&#xff08;hostapt、dnsmasq&#xff09;2. 配置网络&#xff08;无线网卡配置静态IP&#xff09;3. 配置hostapt配置文件4. 配置DHCP服务5. 启动服务&#xff08;hostapd/dnsmasq/network&#xff09;6. IP转发&#xff08;这一步决定了是否…

【QT 网络云盘客户端】——登录界面功能的实现

目录 1.注册账号 2.服务器ip地址和端口号设置 3. 登录功能 4.读取配置文件 5.显示主界面 1.注册账号 1.点击注册页面&#xff0c;将数据 输入 到 用户名&#xff0c;昵称&#xff0c;密码&#xff0c;确认密码&#xff0c;手机&#xff0c;邮箱 的输入框中&#xff0c; 点…

Vue3 导出word

&#x1f642;博主&#xff1a;锅盖哒 &#x1f642;文章核心&#xff1a;导出word 目录 1.首先&#xff0c;你需要安装docxtemplater库。可以使用npm或yarn来安装&#xff1a; 2.在Vue组件中&#xff0c;你可以使用docxtemplater来生成Word文档并提供一个导出按钮供用户下载…