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

文章目录

  • 一、什么是动态内存管理
  • 二、动态内存函数的介绍
    • 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函数什么也不会做。


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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

param.grad、requires_grad、grad_fn、grad/梯度为None?

基本概念 1&#xff09;is_leaf 叶子节点和非叶子节点的区别&#xff1a;计算图中的节点分为叶子节点和非叶子节点&#xff0c;叶子节点可以理解成没有其他tensor再利用它进行计算&#xff08;例如b a1&#xff0c;那么b需要a进行计算&#xff0c;那么a就不是叶子结点&…

day38-Mobile Tab Navigation(手机tab栏导航切换)

50 天学习 50 个项目 - HTMLCSS and JavaScript day38-Mobile Tab Navigation&#xff08;手机tab栏导航切换&#xff09; 效果 index.html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"…

Git克隆文件不显示绿色勾、红色感叹号等图标

1、问题 Git和TorToiseGit安装后&#xff0c;Git克隆的文件不会显示绿色勾、红色感叹号等图标。 2、检查注册表 2.1、打开注册表 (1)WinR打开运行窗口&#xff0c;输入regedit&#xff0c;点击确定&#xff0c;打开注册表编辑器。 2.2、找如下路径 (1)找到路径 计算机\HKEY_…

Java开发环境以及项目搭建案例汇总

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 友情提示 1、 假若你的设备已有可用的Java开发基础环境&#xff0c;则无需重新搭建 2、 假若你需重新搭建Java开发&#xff0c;请务必彻底卸载之前的环境 3、 请尽量保证与…

RocketMQ 行业分享

5.0的架构发生了重大调整&#xff0c;添加了一层rocketmq-proxy,可以通过grpc的方式接入。 参考 https://juejin.cn/post/7199413150973984827

win10安装vs6行号插件

插件包名&#xff1a;win10 VC6LineNumberAddin 下载包&#xff1a; 链接: https://pan.baidu.com/s/13T-NAxQQDcA_K1hHJQ0vWw?pwdbe3r 提取码: be3r 修改reg为以下&#xff1a; Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\DavidHowe Software\Lie…

JAVA SE -- 第十一天

&#xff08;全部来自“韩顺平教育”&#xff09; 异常-Exception 一、异常介绍 1、基本介绍 Java语言中&#xff0c;将程序执行中发生的不正常情况为“异常”&#xff08;开发过程中的语法错误和逻辑错误不是异常&#xff09; 2、执行过程中发生的异常事件可分为两大类 …

MySQL基础(五)主从复制及读写分离

目录 前言 一、概述 &#xff08;一&#xff09;、MySQL Replication &#xff08;二&#xff09;、MySQL复制类型 &#xff08;三&#xff09;、MySQL支持的复制方式 二、部署MySQL主从异步复制 &#xff08;一&#xff09;、master&#xff08;主&#xff09; &#x…

带你读论文第三期:微软研究员、北大博士陈琪,荣获NeurIPS杰出论文奖

Datawhale干货 来源&#xff1a;WhalePaper&#xff0c;负责人&#xff1a;芙蕖 WhalePaper简介 由Datawhale团队成员发起&#xff0c;对目前学术论文中比较成熟的 Topic 和开源方案进行分享&#xff0c;通过一起阅读、分享论文学习的方式帮助大家更好地“高效全面自律”学习&…

Docker Compose 容器编排 + Docker--harbor私有仓库部署与管理

目录 一、Docker Compose简介 1、Docker Compose 的YAML 文件格式及编写注意事项 2、Docker compose 使用的三个步骤 3、 Docker Compose配置常用字段 4、 Docker Compose 常用命令 5、 Docker Compose 文件结构 二&#xff1a; Docker Compose 安装 1、Docker Compose…

基于多场景的考虑虑热网网损的太阳能消纳能力评估研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

勒索病毒最新变种.locked勒索病毒来袭,如何恢复受感染的数据?

引言&#xff1a; 在数字时代&#xff0c;黑客们的阴谋不断蔓延&#xff0c;其中.locked勒索病毒是备受关注的黑暗力量。它们犹如黑夜中的黑暗之星&#xff0c;迅速将用户的数据加密&#xff0c;要挟赎金。本文91数据恢复将深入揭示.locked勒索病毒的独特之处&#xff0c;并探…

【Lua学习笔记】Lua入门

文章目录 Lua变量数据类型变量声明其他表示 Lua语法判断逻辑判断&#xff08;Lua很特殊&#xff0c;这个比较重要&#xff09;短路判断 ifif else 循环whileforrepeat 迭代器泛型for迭代器无状态迭代器多状态的迭代器 Lua函数select方法 数组字符索引_G &#xff08;不是教程&a…

13、PHP面向对象2(方法的访问控制、子类继承、常量)

1、类中的方法可以被定义为公有&#xff0c;私有或受保护。如果没有设置这些关键字&#xff0c;则该方法默认为公有。 public定义的方法&#xff0c;可以在类外使用。 protected定义的方法&#xff0c;只能在本类或子类的定义内使用。 private定义的方法&#xff0c;只能在本…

【Java中间件】RocketMQ

RocketMQ 一、MQ概述 Message Queue&#xff0c;是一种提供消息队列服务的中间件。提供了消息生产、存储、消费全过程API的软件系统。 MQ的作用 限流削峰&#xff1a;当用户发送超量请求时&#xff0c;将请求暂存&#xff0c;以便后期慢慢处理。如果不使用MQ暂存直接请求到…

win10系统wps无法启动(打开文档)

我的win10系统中&#xff0c;之前可以顺畅地打开wps&#xff0c;但最近无法打开文档&#xff0c;停留在启动页面&#xff0c;在任务管理器中可以看到启动的wps线程&#xff0c;如果继续双击文档&#xff0c;线程增加&#xff0c;但依然无法打开文档。 wps版本是刚刚更新的15120…

用于提取数据的三个开源NLP工具

开发人员和数据科学家使用生成式AI和大语言模型&#xff08;LLM&#xff09;来查询大量文档和非结构化数据。开源LLM包括Dolly 2.0、EleutherAI Pythia、Meta AI LLaMa和StabilityLM等&#xff0c;它们都是尝试人工智能的起点&#xff0c;可以接受自然语言提示&#xff0c;生成…

3dsmax制作一个机器人

文章目录 建模身子&#xff1a;眼睛&#xff1a;头饰&#xff1a;肩膀手臂腿调整细节 渲染导出objMarmoset Toolbag 3.08渲染给眼睛添加材质&#xff0c;设置为自发光添加背景灯光 建模 身子&#xff1a; 眼睛&#xff1a; 头饰&#xff1a; 肩膀 手臂 腿 调整细节 渲染 导出…

k8s核心概念

一、集群架构与组件 1&#xff0c;相关组件 【1】 master node三个组件 k8s的控制节点&#xff0c;对集群进行调度管理&#xff0c;接受集群外用户去集群操作请求master node 组成&#xff08;四个组件&#xff09;&#xff1a;控制面 API Server&#xff1a;通信kube-Sche…

路由的配置

1、在router中设置路由导航跳转函数,在index.js文件中写这句话&#xff1a; 1.1 只要发生跳转, 就会调用这个函数&#xff1a; 1.2 导航的声明函数 2、访问系统访问控制系统如何形成 3、来一个导航守卫的案例&#xff1a;看看导航守卫的案例&#xff0c;写一个Main.Vue 和login…