malloc与free

news2024/10/1 12:27:06

目录

前提须知:

malloc:

大意:

头文件:

申请空间:

判断是否申请成功: 

使用空间:

 结果:

整体代码:

 malloc申请的空间怎么回收呢?

注意事项:

free:



前提须知:

为什么要有动态内存分配 ?

我们已经掌握的内存开辟⽅式有:

int val = 20;//在栈空间上开辟四个字节
char arr[10] = {0};//在栈空间上开辟10个字节的连续空间
  • 上述开辟内存空间的特点——空间申请之后不容易调整,或者说不能够进行调整,且数组在申明的时候,必须指定数组的⻓度,数组空间⼀旦确定了⼤⼩不能调整。
  • 而就算是变长数组也只是说数组的大小可以使用变量来指定,而一旦数组创建好后,依然是不能调整大小
  • 而对于申请的空间大小不能灵活的调整,C语言就给了: 动态内存管理,给程序员权限,自己申请,自己使用,使用完后,自己释放。

而开辟和释放所需要用到的函数就是malloc与free

  • malloc是用来申请内存的
  • free是用来释放内存的

malloc:

C语⾔提供了⼀个动态内存开辟的函数:

 void* malloc (size_t size);

大意:

想要多少字节就向内存申请多少个字节, 申请成功后会返回一共空间的起始地址,开辟失败会返回空指针(NULL)。

头文件:

#include <stdlib.h>

申请空间:

malloc(10 * sizeof(int));
//申请10个整型的空间 - 40个字节

判断是否申请成功: 

if (p == NULL)
{
 perror("malloc");
 return 1;
}

因为申请成功会返回起始地址,而返回的类型是void*所以我们要进行使用的时候需要进行转化。

int *p = (int*)malloc(10 * sizeof(int));

使用空间:

int i = 0;
for (i = 0; i <10; i++)
{
    *(p + i) = i;
}

for (i = 0;i < 10; i++)
{    printf("%d",p[i]);
     return 0;
}
  •  p+i表示地址,*(p+i)表示地址所指向的元素,所以这是给每个不同地址的不同的元素赋值。
  • p[i]相当于*(p+i)

 结果:

整体代码:

int main()
{
     int *p = (int*)malloc(10 * sizeof(int));
     if (p == NULL)
   {
     perror("malloc");
     return 1;
   }
    int i = 0;
    for (i = 0; i <10; i++)
  {
    *(p + i) = i;
  }

    for (i = 0;i < 10; i++)
  {    
    printf("%d",p[i]);
    return 0;
  }

     return 0;
}

 malloc申请的空间怎么回收呢?

  1. free回收
  2. 自己不释放的时候,程序结束后,也会由操作系统回收
  3. malloc是堆区上申请内存

 

注意事项:

  • 如果开辟成功,则返回⼀个指向开辟好空间的指针。
  • 如果开辟失败,则返回⼀个 NULL 指针,因此malloc的返回值⼀定要做检查。
  • 返回值的类型是 void* ,所以malloc函数并不知道开辟空间的类型,具体在使⽤的时候使⽤者⾃⼰来决定。
  • 如果参数 size 为0,malloc的⾏为是标准是未定义的,取决于编译器。 

free:

C语⾔提供了另外⼀个函数free,专⻔是⽤来做动态内存的释放和回收的,函数原型如下:

void free (void* ptr);

 free函数⽤来释放动态开辟的内存。

  • 如果参数 ptr 指向的空间不是动态开辟的,那free函数的⾏为是未定义的。
  • 如果参数 ptr 是NULL指针,则函数什么事都不做。
  • malloc和free都声明在 stdlib.h 头⽂件中。
int main()
{
     int *p = (int*)malloc(10 * sizeof(int));
     if (p == NULL)
   {
     perror("malloc");
     return 1;
   }
    int i = 0;
    for (i = 0; i <10; i++)
  {
    *(p + i) = i;
  }

    for (i = 0;i < 10; i++)
  {    
    printf("%d",p[i]);
    return 0;
  }
     free(p);//释放
     p = NULL;
     return 0;
}

free(p);
p = NULL;

  • p内存放的是申请的空间的起始位置。
  • 而free只是把p指向的空间回收了。
  • 而对于以上两段代码我们还得让p指针忘记申请空间的空间起始地址,不然p会变成野指针。

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

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

相关文章

uniapp级联菜单地点区域使用label值,web端el-cascader绑定的value

效果图 一、uniapp uniapp级联菜单地点区域使用label值 1.ui使用 <uni-forms-item label="地址" name="userArea" required><view class="" style="height: 100%;display: flex;align-items: center;">

神经网络 03(参数初始化)

一、参数初始化 对于某一个神经元来说&#xff0c;需要初始化的参数有两类&#xff1a;一类是权重W&#xff0c;还有一类是偏置b&#xff0c;偏置b初始化为0即可。而权重W的初始化比较重要&#xff0c;我们着重来介绍常见的初始化方式。 &#xff08;1&#xff09;随机初始化 …

zabbix监控告警邮箱提醒,钉钉提醒

一、注册网易邮箱及其配置邮箱 1、开启POP3/SMTP/IMAP 二、service端配置邮件服务 1.安装 mailx dos2unix yum install -y mailx dos2unix mailx&#xff1a;邮件服务 mos2unix&#xff1a;用于转换文本文件格式的实用工具 查看mailx版本 2.配置mailx配置文件 编辑&#xf…

控制理论::带零点的二阶系统时域响应分析

一、系统描述 二、系统分析(分类讨论分析) 1、类型一&#xff08;极点为实数&#xff08;阻尼比>1&#xff09;&#xff0c;零点为负实数&#xff08;τ-1/b<0&#xff09;&#xff09; 1.1 定性分析 1.2 定量分析 有零点二阶系统的动态性能分析 - 豆丁网 (docin.com)

Python WEB框架FastAPI (二)

Python WEB框架FastAPI &#xff08;二&#xff09; 最近一直在使用fastapi&#xff0c;随着使用的深入发现我对于它的了解还是太少了&#xff0c;以至于踩了一些坑。所以在这里记录一下&#xff0c;愿看到的小伙伴不迷路。 路径传参并发问题 一、路径传参 这是对上一个传参…

TTS | 利用Fastspeech训练LJSpeech语音数据集后英文文本生成语音及代码详解

FastSpeech 基于 Transformer 的前馈网络&#xff0c;用于并行生成 TTS 梅尔谱图。 FastSpeech 模型与自回归 Transformer TTS 相比&#xff0c;梅尔谱图生成速度加快了 270 倍&#xff0c;端到端语音合成速度加快了 38 倍。 项目实现 docker cp LJSpeech-1.1.tar.bz2 torch_…

Kibana 安装部署 - Centos7

Kibana 安装部署 - Centos7 本文介绍一下在Centos7上部署和配置Kibana1、下载 直接去官网地址进行下载即可。【注意】&#xff1a; 一定要下载和你的ES版本一致的Kibana。比如我的ES的版本是 7.9.1&#xff0c;所以我下载的kibana就是7.9.1。下载地址 &#xff1a; https://w…

活动报名|如何使用70万预算从头训练千亿语言大模型

王业全 北京智源人工智能研究院认知模型团队负责人&#xff0c;清华大学博士&#xff0c;中国中文信息学会情感计算专委会委员&#xff0c;2022年被评为AI 2000全球最具影响力人工智能学者&#xff08;自然语言处理领域&#xff09;。主要从事语言大模型、自然语言处理方面的研…

Laravel框架 - 中间件篇

什么是中间件&#xff1f; 在 Laravel 框架中&#xff0c;中间件是一种用于处理 HTTP 请求的组件。它允许你在请求进入 路由 处理 之前 或 之后 执行一些代码逻辑。 中间件的优势和功能 处理身份验证&#xff1a;验证用户是否已经登录或者检查用户是否有权限访问特定的路由 记…

国外发达国家码农是真混得好么?

来看看花旗工作十多年的码农怎么说吧! 美国最大的论坛 Reddit&#xff0c;之前有一个热帖&#xff1a; 一个程序员说自己喝醉了&#xff0c;软件工程师已经当了10年&#xff0c;心里有 好多话想说&#xff0c;“我可能会后悔今天说了这些话。”他洋洋洒洒写了 一大堆&#xff…

Knife4jInsight ,Knife4j 的商业化产品之路

Knife4jInsight &#xff0c;Knife4j 的商业化产品之路 写在前面产品定位产品名称技术架构功能架构产品定价最后 Knife4jInsight &#xff0c;Knife4j 的商业化产品之路 在之前发布的《Knife4j新产品的想法》一文中&#xff0c;我提到想给Knife4j的生态做一些扩展&#xff0c…

使用Python和XPath解析动态JSON数据

JSON动态数据在Python中扮演着重要的角色&#xff0c;为开发者提供了处理实时和灵活数据的能力。Python作为一种强大的编程语言&#xff0c;提供了丰富的工具和库来处理动态JSON数据使得解析和处理动态JSON数据变得简单和高效。例如&#xff0c;使用内置的json模块&#xff0c;…

SQL Server Management Studio 打开非常慢

一、去掉启动画面(感觉没用) 目标增加参数 /nosplash 二、打开控制面板 设置 Internet选项 基本上5秒就可以打开了

使用Python构建强大的网络爬虫

介绍 网络爬虫是从网站收集数据的强大技术&#xff0c;而Python是这项任务中最流行的语言之一。然而&#xff0c;构建一个强大的网络爬虫不仅仅涉及到获取网页并解析其HTML。在本文中&#xff0c;我们将为您介绍创建一个网络爬虫的过程&#xff0c;这个爬虫不仅可以获取和保存网…

计算机视觉与深度学习-全连接神经网络-训练过程-权值初始化- [北邮鲁鹏]

文章目录 思想避免全零初始化随机权值初始化权值初始化太小&#xff1a;权值初始化太大Xavier初始化目标为什么输入和输出分布会变得不同&#xff1f;Xavier在使用Tanh时的表现好Xavier在使用ReLU时的表现不好 HE初始化&#xff08;MSRA&#xff09;权值初始化总结 思想 通过调…

Kafka 集群与可靠性

文章目录 Kafka集群的目标Kafka集群规模如何预估Kafka集群搭建实战Kafka集群原理成员关系与控制器集群工作机制replication-factor参数auto.leader.rebalance.enable参数 集群消息生产可靠的生产者ISR&#xff08;In-sync Replicas&#xff09;使用ISR方案的原因ISR相关配置说明…

一键转换!轻松将视频转换为TS格式,让您的视频播放更顺畅!

尊敬的用户们&#xff0c;您是否遇到过需要将视频转换为TS格式的情况&#xff0c;但不知道应该如何操作&#xff1f;现在&#xff0c;我们为您提供一款简单而高效的工具&#xff0c;让您轻松将视频转换为TS格式&#xff0c;让您的视频播放更加顺畅&#xff01; 首先&#xff0…

【flutter】架构之商城main入口

架构之商城main入口 前言一、项目模块的划分二、入口main的配置三、配置文件怎么做总结 前言 本栏目我们将完成一个商城项目的架构搭建&#xff0c;并完善中间的所有功能&#xff0c;总页面大概200个&#xff0c;如果你能看完整个栏目&#xff0c;你肯定能独立完成flutter 项目…

Java-根据模板生成PDF

文章目录 前言一、准备模板二、代码实现三、源代码总结 前言 在有些场景下我们可能需要根据指定的模板来生成 PDF&#xff0c;比如说合同、收据、发票等等。因为 PDF 是不可编辑的&#xff0c;所以用代码直接对 PDF 文件进行修改是很不方便的&#xff0c;这里我是通过 itext 和…

优思学院|六西格玛核心方法:CTQ关键质量树

在六西格玛管理方法中&#xff0c;CTQ是Critical-To-Quality的缩写。CTQ代表客户需求&#xff0c;这些需求被认为是项目/产品/流程的成功与否的关键因素&#xff0c;得到了执行团队的认可。CTQ树最初是作为六西格玛方法的一部分开发的。然而&#xff0c;您可以在各种情况下使用…