动态内存与动态内存函数详解

news2024/10/6 14:35:11

文章目录

  • 前言
  • 一、动态内存函数的介绍
    • 1.malloc函数
    • 2.calloc
    • 3.realloc
    • 4.free
  • 二、两种常见的内存申请方法
    • 1.返回指针
    • 2.传二级指针
  • 三.常见的动态内存错误
    • 1.对NULL指针的解引用操作
    • 2.对动态开辟空间的越界访问
    • 3.对非动态开辟内存使用free释放
    • 4.使用free释放一块动态开辟内存的一部分
    • 5.对同一块动态内存多次释放
    • 6.动态开辟内存忘记释放(内存泄漏)
  • 总结


在这里插入图片描述

前言

为什么我们需要了解动态内存和函数?我们初始化一个函数时,这个函数是程序为我们自动分配的int val = 20;//在栈空间上开辟四个字节char arr[10] = {0};//在栈空间上开辟10个字节的连续空间
那么我们不想程序自动分配,我们需要自己分配呢?,这就需要了解动态内存和内存函数了


一、动态内存函数的介绍

1.malloc函数

malloc函数介绍
void* malloc (size_t size);

  • 头文件需要包含stdlib.h
  • 这个函数向内存申请一块连续可用的空间,并返回指向这块空间的指针。
  • 如果开辟成功,则返回一个指向开辟好空间的指针。
  • 如果开辟失败,则返回一个NULL指针,因此malloc的返回值一定要做检查。
  • 返回值的类型是 void* ,所以malloc函数并不知道开辟空间的类型,具体在使用的时候使用者自己
    来决定。
  • 如果参数 size 为0,malloc的行为是标准是未定义的,取决于编译器。

好,用法讲完了,怎么用呢?
在这里插入图片描述

通过这个例子,我们来根据上面的例子来解读一下

在这里插入图片描述我上面有一个小问题,你能看出来吗(嘻嘻),那就是经典的错误,内存泄漏,至于这方面的知识后面讲

2.calloc

calloc函数介绍
void *calloc( size_t num, size_t size );

  • 函数的功能是为 num 个大小为 size 的元素开辟一块空间,并且把空间的每个字节初始化为0。
  • 与函数 malloc 的区别只在于 calloc 会在返回地址之前把申请的空间的每个字节初始化为全0
  • 需要包含头文件stdlib.h

在这里插入图片描述

3.realloc

realloc介绍
void *realloc( void *memblock, size_t size );

  • ptr 是要调整的内存地址
  • size 调整之后新大小
  • 返回值为调整之后的内存起始位置。
  • 这个函数调整原内存空间大小的基础上,还会将原来内存中的数据移动到 新 的空间。
    realloc在调整内存空间的是存在两种情况:
    情况1:原有空间之后有足够大的空间,会在原有指针的后面扩
    情况2:原有空间之后没有足够大的空间,会在异地扩
    在这里插入图片描述
    当然,realloc还能减容,嘿嘿,没想到吧
    在这里插入图片描述
    在这里插入图片描述

4.free

C语言提供了另外一个函数free,专门是用来做动态内存的释放和回收的,函数原型如下

void free (void* ptr);

  • 如果参数 ptr 指向的空间不是动态开辟的,那free函数的行为是未定义的。
  • 如果参数 ptr 是NULL指针,则函数什么事都不做
  • 需要包含头文件stdlib.h
    注意申请空间与free需要成对出现,不然你大概率犯了内存泄漏的错误

二、两种常见的内存申请方法

1.返回指针

在这里插入图片描述

2.传二级指针

在这里插入图片描述
修改一个变量需要传他的指针,修改一个指针变量就需要传他的二级指针

三.常见的动态内存错误

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

void test()
{
int *p = (int *)malloc(INT_MAX/4);
*p = 20;//如果p的值是NULL,就会有问题
free(p);
}

那么我们就可以有一下两种方式来检查p是不是NULL
在这里插入图片描述

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

void test()
{
int i = 0;
int *p = (int *)malloc(10*sizeof(int));
if(NULL == p)
{
exit(EXIT_FAILURE);
}
for(i=0; i<=10; i++)
{
*(p+i) = i;//当i是10的时候越界访问
}
free(p);
}

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

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

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

void test()
{
int *p = (int *)malloc(100);
p++;
free(p);//p不再指向动态内存的起始位置
}

5.对同一块动态内存多次释放

void test()
{
int *p = (int *)malloc(100);
free(p);
free(p);//重复释放
}

其实你这样改进,就不会有错误了

void test()
{
int *p = (int *)malloc(100);
free(p);
p=NULL;
free(p);//重复释放
}

所以养成一个良好的习惯是很重要的

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

void test()
{
int *p = (int *)malloc(100);
if(NULL != p)
{
*p = 20;
}
}
int main()
{
test();
while(1);
}

这个要尤其重视

总结

动态内存和动态动态内存函数算是讲完了,有错误希望各位指正,谢谢

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

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

相关文章

6. 描述性统计函数:summary 、Fivenum、describe、describeBy、stat.desc、 Aggregate、summaryBy

b站课程视频链接&#xff1a; https://www.bilibili.com/video/BV19x411X7C6?p1 腾讯课堂(最新&#xff0c;但是要花钱&#xff0c;我花99&#x1f622;&#x1f622;元买了&#xff0c;感觉讲的没问题&#xff0c;就是知识点结构有点乱&#xff0c;有点废话&#xff09;&…

ESP32设备驱动-ADXL345三轴加速计驱动

ADXL345三轴加速计驱动 文章目录 ADXL345三轴加速计驱动1、ADXL345介绍2、硬件准备3、软件准备4、驱动实现1、ADXL345介绍 ADXL345 是一款小型、薄型、低功耗、3 轴加速度计,具有高达 16g 的高分辨率(13 位)测量值。数字输出数据采用 16 位二进制补码格式,可通过 SPI(3 线…

C进阶:动态内存函数 malloc calloc realloc free及常见动态内存开辟错误

本文主要讲解动态内存开辟的有关知识。 目录 一.malloc 与 free 1.malloc 2.free 3.实例&#xff1a; 二.calloc 三.realloc 四.常见的动态内存错误 1.对NULL指针的解引用操作 2.对动态开辟空间的越界访问 3.对非动态开辟内存使用free释放 4.使用free释放一块动态…

springboot 构建多模块项目

新建 spring initializr 父项目 Spring 官方提供了 Spring Initializr 来引导大家快速构建一个应用项目。在此不细说。 idea 创建 1、 new – project 注意jdk版本 和 勾选 default,然后next 2、 填写项目信息 3、选择项目组成部分,也可后期加上 4、选择项目位置 --选…

Docker入门:介绍Docker的常用命令、镜像的加载原理、Dockerfile打包、Docker网络、Docker Compose容器编排+监控

Docker入门 1&#xff09;从面向对象角度来看&#xff0c;Docker利用容器&#xff08;Container&#xff09;独立运行一个或一组应用&#xff0c;应用程序或服务运行在容器里面&#xff0c;容器就类似于一个虚拟化的运行环境&#xff0c;容器是用镜像创建出来的运行实例。就像是…

区块链笔记4--BTC实现

1 UTXO &#xff1a;区块链是一个去中心化的账本&#xff0c;比特币采用了 基于交易的账本模式。然而&#xff0c;系统中并无显示记录账户包含BTC数&#xff0c;实际上其需要通过交易记录进行推算。在比特币系统中&#xff0c;全节点需要维护一个名为 UTXO(UnspentTransaction …

Java抽象类:案例、特点、模板方法模式

一.抽象类的案例 案例&#xff1a;加油站支付卡 系统需求&#xff1a; 某加油站推出了2种支付卡&#xff1a; 1、预存1万元的金卡&#xff0c;后续加油享受8折优惠&#xff1b; 2、预存5千元的银卡&#xff0c;后续加油享受8.5折优惠。 请分别实现2种卡片进入收银系统后的…

记录每日LeetCode 2293.极大极小游戏 Java实现

题目描述&#xff1a; 给你一个下标从 0 开始的整数数组 nums &#xff0c;其长度是 2 的幂。 对 nums 执行下述算法&#xff1a; 设 n 等于 nums 的长度&#xff0c;如果 n 1 &#xff0c;终止 算法过程。否则&#xff0c;创建 一个新的整数数组 newNums &#xff0c;新数组…

分享66个HTMLCSS源码,总有一款适合您

HTML&CSS源码 分享66个HTML&CSS源码&#xff0c;总有一款适合您 下面是文件的名字&#xff0c;我放了一些图片&#xff0c;文章里不是所有的图主要是放不下...&#xff0c;大家下载后可以看到。 源码下载链接&#xff1a;https://pan.baidu.com/s/1AeVqON7byvt-ngB_U…

位段与枚举

目录 1、位段 1、位段的声明 2、位段的内存分配特点 3、位段的跨平台问题 4、位段的应用 2、枚举 1、枚举类型的定义 2、枚举的优点 3、联合体&#xff08;共用体&#xff09; 1、联合类型的定义 2、联合体的特点即大小计算 1、位段 1、位段的声明 位段的位指的是…

Pr初识01

Pr初识1.关于Pr&#xff1a;2.项目序列3.PR工作界面4.导入素材5.制式与素材管理6.剪辑与工具7.剪辑与工具&#xff08;下&#xff09;8.工具面板与时间轴面板进阶9.关键帧动画10.视频特效11.视频特效&#xff08;下&#xff09;12.音频及结合AU去除噪音13.字幕运用1.关于Pr&…

微信小程序自定义组件、组件的生命周期和组件通信(插槽)

文章目录导航路线自定义组件组建的创建和使用1.创建组件2.引用组件3. 局部引用组件4. 全局引用组件5. 全局引用 VS 局部引用6. 组件和页面的区别样式1.组件样式隔离2. 组件样式隔离的注意点3. 修改组件的样式隔离选项4. styleIsolation 的可选值数据、方法和属性1. data 数据2.…

Arduino UNO驱动 AT24C256 EEPROM存储器模块

Arduino UNO驱动 AT24C256 EEPROM存储器模块 AT24C256模块简介模块引脚定义Arduino UNO与模块接线测试代码实验结果AT24C256模块简介 AT24C256是一个串行EEPROM存储器&#xff0c;提供了256k bit256*1024 bit262144 bit32768 Byte32K Byte大小的存储空间&#xff0c;在芯片内部…

Jmeter做数据构造步骤详解

Jmeter做数据构造步骤详解引入什么是数据构造数据构造的方式数据构造的意义一、JDBC请求执行SQL语句构造数据01 环境准备&#xff1a;添加Jmeter插件02 使用步骤二、HTTP请求调用接口构造数据01 使用步骤完善脚本01 运用函数02 使用逻辑控制器和定时器03 添加响应断言自动判断构…

拒绝平庸,张扬出彩——维乐VELO Angel Revo

在赛场上就要做那个万众瞩目的明星&#xff0c;闪耀自己&#xff0c;让自己的实力让所有人看到&#xff01;作为骑行运动员&#xff0c;骑行配件当然是最能够彰显自我个性的地方&#xff0c;维乐美学系列明星产品Angel Revo正如其名&#xff0c;全面革新&#xff0c;也给了所有…

【自学Python】Python拼接字符串

Python拼接字符串 Python拼接字符串教程 Python 拼接 字符串 有两种方法&#xff1a;一种是直接把两个字符串写在一起&#xff0c;即可实现拼接&#xff0c;另一种是使用 来实现字符串的拼接。 Python拼接字符串详解 写在一起 语法 str1str2参数 参数描述str1要拼接的字…

BERT 词向量理解及训练更新

1、BERT 词向量理解 在预训练阶段中&#xff0c;词向量是在不断更新的&#xff0c;而在fine-tuning阶段中&#xff0c;词向量是固定不变的。在fine-tuning阶段中&#xff0c;我们使用预训练好的模型参数来对新的数据进行训练。 BERT模型在预训练阶段中&#xff0c;会学习词表中…

win10开启自带的手机投屏功能方式

本篇文章主要讲解win10开启自带的手机投屏方式。 日期&#xff1a;2023年1月15日 作者&#xff1a;任聪聪 开启后效果 点击连接 打开连接或通过手机其他网络进行连接。 连接步骤&#xff1a; 步骤一、打开手机端的wifi网络设置&#xff0c;点击高级设置或其他网络设置&…

论文的正确打开方式—如何细读一篇论文分享

前段时间听了一个关于读论文的公开课&#xff0c;课上的老师讲的非常好&#xff0c;听完之后确实发现从以前看论文的没头没脑到现在的有了一些思绪的变化&#xff0c;所以特此整理了一下分享给大家&#xff0c;希望对大家有用。 在我们初次接触论文的时候&#xff0c;经常性的遇…

《后端技术面试 38 讲》学习笔记 Day 12

《后端技术面试 38 讲》学习笔记 Day 12 31 | 大数据架构&#xff1a;大数据技术架构的思想和原理是什么&#xff1f; 原文摘抄 大数据技术其实是分布式技术在数据处理领域的创新性应用&#xff0c;本质和我们此前讲到的分布式技术思路一脉相承&#xff1a;用更多的计算机组成…