当前位置: 首页 > news >正文

动态内存管理(C语言)

前言
在学习数据结构时,掌握指针、结构体和动态内存管理是非常关键的,它们就像是搭建程序框架和操作内存的工具箱,需要熟练掌握才能更加游刃有余地进行编程。
指针和结构体我们已经在之前详细的讲过了,今天我将带大家学习动态内存管理。
如果还没有学习指针和结构体可以点击下面的连接前去学习。
指针的连接

结构体的连接
在这里插入图片描述

文章目录

  • 1,为什么要动态内存分配
  • 2,malloc,free
  • 3,calloc,realloc
  • 4,常见的动态内存错误
  • 5,柔性数组
  • 6,尾声

1,为什么要动态内存分配

平时我们一般是这样开辟一块内存。

int a = 0//开辟四个字节的内存
int arr[10] = {0};//开辟四十个字节的内存

但是很明显,给其开辟的那份空间没法再变大变小了,比如我创建了一个十个元素的数组,可是我现在向往里面装20个元素,显然是办不到的,又或是我现在只想往里面装5个元素,那剩下五个元素的空间就浪费了。那么这时候就需要用到我们的动态内存分配。
动态内存分配,显然内存分配是会变化的。那么它是变化的呢?

2,malloc,free

那么我们首先要介绍malloc和free这两个函数。
malloc
在这里插入图片描述
这个函数的功能是指定一个所需空间的大小,然后就会向内存申请开辟一块连续可用的空间,返回给你那片空间的地址。
即参数size就是你所需要开辟空间的大小单位为字节,当你执行该函数后,他会返回给你一个void类型的指针,指针中是你要开辟的那份空间的地址。
注意事项
1,如果开辟成功,那么就会返回那片空间的地址。
2,如果没有开辟成功,那么就会返回一个空指针。所以一定要对malloc的返回值进行判定,以检查是否开辟成功。
3,返回的指针类型是void
,所以需要对返回类型根据你所需要的类型进行强制类型转换。
4,他的头文件时stdlib,不要忘记带。
5,在堆区开辟内存空间,而不是栈区或是静态区

free
在这里插入图片描述
free是用来释放动态内存开辟的空间的函数。当动态申请的空间不再使用的时候,就应该还给操作系统。
注意事项
如果memblock指向的空间不是动态内存开辟的,那么free的行为是未定义的.

使用

	#include<stdio.h>#include<stdlib.h>int main(){char* arr = (char*)malloc(11 * sizeof(char));//申请11个字节的空间,强制转化为char*类型的指针if (arr == NULL)//判断是否开辟成功{printf("内存分配失败");return 1;}for (int i = 0; i < 10; i++){arr[i] = i+'0';}arr[10] = '\0';printf(arr);free(arr);//释放内存arr = NULL;//将arr置为空指针return 0;}

3,calloc,realloc

接下来我们介绍calloc,和realloc这两个函数。

calloc
在这里插入图片描述
这个函数可以开辟一个内存中连续的空间并将空间里的每个字节初始化为0,第一个参数为元素的个数,第二个参数 为每个元素的字节大小,函数的返回类型依旧是 void * 类型。
与malloc的主要区别就是他会把申请的空间的每个字节都出初始化为0,而malloc则不会。
使用方法与malloc大差不差,都要判定是否开辟成功,并且在不使用时将其内存释放。

realloc
在这里插入图片描述
这个函数的功能是重新分配内存空间,调整之前开辟动态内存空间的大小, 第一个参数是之前开辟内存块的地址 ,第二个参数是调整后空间的字节大小,函数的返回类型还是void *类型。当我们觉得之前开辟的动态内存空间太大或者是太小,我们就可以使用这个函数对其进行调整。
注意事项
如果是将动态内存空间变大的话大致会分为两种情况。
1,
在这里插入图片描述
这种情况下增大内存空间不会影响到已被占用的空间,所以可以直接进行扩大。
2,
在这里插入图片描述
另找一个新空间的同时,原有开辟的内存直接被释放,我们不需要考虑内存泄漏的问题。

4,常见的动态内存错误

1,对NULL指针的解引用操作
在申请动态内存空间后忘记判定是否开辟成功,如果开辟失败会返回空指针,对空指针进行解引用操作是非法操作,编辑器会报发错误。
2.对动态开辟的内存进行越界访问

	#include<stdio.h>#include<stdlib.h>int main(){char* arr = (char*)malloc(11 * sizeof(char));//申请11个字节的空间,强制转化为char*类型的指针if (arr == NULL)//判断是否开辟成功{printf("内存分配失败");return 1;}for (int i = 0; i < 20; i++)//会越界访问{arr[i] = i+'0';}free(arr);//释放内存arr = NULL;//将arr置为空指针return 0;}

3.对非动态开辟的内存free

	#include<stdio.h>#include<stdlib.h>int main(){char a = '6';char* arr = &a;free(arr);arr = NULL;return 0;}

free函数只能对我们开辟的动态内存进行释放操作。

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

#include<stdio.h>#include<stdlib.h>int main(){char* arr = (char*)malloc(20 * sizeof(char));//申请20个字节的空间,强制转化为char*类型的指针if (arr == NULL)//判断是否开辟成功{printf("内存分配失败");return 1;}int i = 0;while( i < 10 ){*arr++ = i+'0';}free(arr);//此时arr的偏移量为10不是初始的位置arr = NULL;return 0;}

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

	#include<stdio.h>#include<stdlib.h>int main(){char* arr = (char*)malloc(20 * sizeof(char));//申请20个字节的空间,强制转化为char*类型的指针if (arr == NULL)//判断是否开辟成功{printf("内存分配失败");return 1;}for (int i = 0; i < 20; i++){arr[i] = i+'0';}free(arr);free(arr);//释放了两次arr = NULL;return 0;}

一块内存空间只能释放一次。
6.动态开辟内存忘记释放
忘记释放动态开辟的空间可能会造成内存泄漏。动态开辟的空间一定要记得释放!

5,柔性数组

请点这里

6,尾声

正确地管理动态内存可以提高程序的性能和可靠性,避免许多令人头痛的问题。希望本文能够帮助小伙伴们更好地理解动态内存管理。如果觉得博主讲的不错的话请给博主点个赞收个藏支持一下吧~。

相关文章:

动态内存管理(C语言)

前言 在学习数据结构时&#xff0c;掌握指针、结构体和动态内存管理是非常关键的&#xff0c;它们就像是搭建程序框架和操作内存的工具箱&#xff0c;需要熟练掌握才能更加游刃有余地进行编程。 指针和结构体我们已经在之前详细的讲过了&#xff0c;今天我将带大家学习动态内存…...

区块链实验室(32) - 下载arm64的Prysm

Prysm是Ethereum的共识层。 1. 下载prysm.sh curl https://raw.githubusercontent.com/prysmaticlabs/prysm/master/prysm.sh --output prysm.sh && chmod x prysm.sh2. 下载x86版prysm共识客户端 ./prysm.sh beacon-chain --download-only3.下载arm64版prysm共识客…...

flutter学习-day3-dart基础

&#x1f4da; 目录 变量声明操作符数据类型控制流错误处理和捕获函数mixin异步 FutureStream 本文学习和引用自《Flutter实战第二版》&#xff1a;作者&#xff1a;杜文 1. 变量声明 var 类似于 JavaScript 中的var&#xff0c;它可以接收任何类型的变量&#xff0c;但最大…...

gitblit自建git仓库

在Ubuntu服务器 安装 java sudo apt-get update sudo apt-get install openjdk-8-jdk # 或者其它你喜欢的版本//sudo snap install gitblit 验证&#xff1a; java -version下载 gitblit https://github.com/gitblit-org/gitblit/releases解压/usr/local tar -zxvf gitb…...

二百一十一、Flume——Flume实时采集Linux中的Hive日志写入到HDFS中(亲测、附截图)

一、目的 为了实现用Flume实时采集Hive的操作日志到HDFS中&#xff0c;于是进行了一场实验 二、前期准备 &#xff08;一&#xff09;安装好Hadoop、Hive、Flume等工具 &#xff08;二&#xff09;查看Hive的日志在Linux系统中的文件路径 [roothurys23 conf]# find / -name…...

python 实现 AIGC 大模型中的概率论:生日问题的基本推导

在上一节中&#xff0c;我们对生日问题进行了严谨的阐述&#xff1a;假设屋子里面每个人的生日相互独立&#xff0c;而且等可能的出现在一年 365 天中的任何一天&#xff0c;试问我们需要多少人才能让某两个人的生日在同一天的概率超过 50%。 处理抽象逻辑问题的一个入手点就是…...

YOLOv8算法改进【NO.87】引入上下文引导网络(CGNet)的Light-weight Context Guided改进C2_f

前 言 YOLO算法改进系列出到这,很多朋友问改进如何选择是最佳的,下面我就根据个人多年的写作发文章以及指导发文章的经验来看,按照优先顺序进行排序讲解YOLO算法改进方法的顺序选择。具体有需求的同学可以私信我沟通: 第一,创新主干特征提取网络,将整个Backbone改…...

GPT-4V 在机器人领域的应用

在科技的浩渺宇宙中&#xff0c;OpenAI如一颗璀璨的星辰&#xff0c;于2023年9月25日&#xff0c;以一种全新的方式&#xff0c;向世界揭示了其最新的人工智能力作——GPT-4V模型。这次升级&#xff0c;为其旗下的聊天机器人ChatGPT装配了语音和图像的新功能&#xff0c;使得用…...

Java基础语法之访问修饰限定符

private 表示私有的&#xff0c;只能在同一个包中的同一个类使用 像这样就是在同一个包中的不同类用了private修饰的变量&#xff0c;这是非法的&#xff0c;那到底该如何给a赋值呢&#xff1f;可以在定义时就赋值&#xff0c;但这样的代码就没有可操作性&#xff0c;所以我们…...

算法通关村第十八关 | 青铜 | 回溯

1.回溯 回溯可以视为递归的拓展&#xff0c;有着明确的解题模板。 很大的不同之处是有一个撤销处理结果的操作&#xff0c;但是大框架就是遍历 N 叉树。 回溯主要解决暴力枚举都解决不了的问题。 回溯模板&#xff1a; void backtracking(参数) {if (终止条件) {存放结果;…...

蓝牙在物联网中的应用,相比WIFI和NFC的优势?

蓝牙在物联网中有着广泛的应用&#xff0c;主要包括以下几个方面&#xff1a; 1、智能家居&#xff1a;蓝牙Mesh技术可以用于智能家居设备之间的连接和通信&#xff0c;实现设备的远程控制和管理。例如&#xff0c;通过蓝牙技术可以将智能音箱、智能电视、智能家电等设备连接起…...

Altair推出 Altair RapidMiner 2023 平台,提供生成式 AI 功能

Altair推出 Altair RapidMiner 2023 平台&#xff0c;提供生成式 AI 功能 更新包括自动聚类、扩展 SAS、Python 和 R 编程功能等 近日&#xff0c;Altair&#xff08;纳斯达克股票代码&#xff1a;ALTR&#xff09;近日宣布其数据分析和 AI 平台 Altair RapidMiner 取得了一系…...

包管理工具npm与yarn

1.npm 1.1 安装 安装node后自带了npm 2.2 初始化package.json npm init 1.3 安装包 单个包&#xff1a;npm install less或npm i less 所有包&#xff1a;npm installnpm i 1.4 删除包 npm remove less&#xff0c;npm r less或npm uninstall less 1.5 配置别名 pack…...

深度学习 Day11——T11优化器对比实验

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 文章目录 前言一、我的环境二、代码实现与执行结果1.引入库2.设置GPU&#xff08;如果使用的是CPU可以忽略这步&#xff09;3.导入数据4.查…...

(十六)Flask之蓝图

蓝图 Flask蓝图&#xff08;Blueprint&#xff09;是Flask框架中用于组织和管理路由、视图函数以及静态文件的一种机制。它提供了一种将应用程序拆分为更小、可重用组件的方式&#xff0c;使得项目结构更清晰&#xff0c;代码更易于维护。 使用Flask蓝图&#xff0c;可以将相…...

面试问题--文件IO

文件 I/O 操作在 C 语言中的使用 在 C 语言中&#xff0c;文件 I/O&#xff08;Input/Output&#xff09;操作是处理文件的重要部分。本文将介绍一些常见的文件 I/O 操作及其使用示例。 打开和关闭文件 1.打开文件&#xff1a; fopen() 函数用于打开一个文件。 FILE *fpt…...

SpringBoot中实现跨域的几种常用方式

在SpringBoot中实现跨域请求可以通过以下几种方式&#xff1a; 1. 使用CrossOrigin注解&#xff0c;可以直接在Controller层的方法上使用&#xff0c;用来指定允许跨域请求的来源、方法和头信息。例如&#xff1a; CrossOrigin(origins "http://localhost:8080") …...

MeterSphere实战(一)

MeterSphere是一位朋友讲到的测试平台&#xff0c;说这东西是开源的&#xff0c;因为我是做测试的&#xff0c;很乐意了解一些新鲜事物。在我看来&#xff0c;测试就是要专注一些领域&#xff0c;然后要啥都会一点点&#xff0c;接着融会贯通起来&#xff0c;这样就可以万变不离…...

ESP32-Web-Server编程-在网页中插入图片

ESP32-Web-Server编程-在网页中插入图片 概述 图胜与言,在网页端显示含义清晰的图片,可以使得内容更容易理解。 需求及功能解析 本节演示在 ESP32 Web 服务器上插入若干图片。在插入图片时还可以对图片设置一个超链接,用户点击该图片时,网页将跳转到图片对应的链接网址…...

<软考>软件设计师-4知识产权与标准化(总结)

(一)知识产权概述 1 知识产权 是指公民、法人、非法人单位对自己的创造性智力成果和其他科技成果依法享有的民事权。是智力成果的创造人依法享有的权利和在生产经营活动中标记所有人依法所享有的权利的总称。包含著作权、专利权、商标权、商业秘密权、植物新品种权、集成电路布…...

唯创知音WTVxxx语音芯片在免洗烘干机中的应用:提升用户体验与产品智能化

在现今这个高科技普及的时代&#xff0c;人们对家电产品的需求不再仅仅满足于基本功能&#xff0c;而是更多的关注用户体验和产品智能化。因此&#xff0c;唯创知音WTVxxx语音芯片在免洗烘干机中的应用&#xff0c;无疑是对这一需求的完美回应。 唯创知音WTVxxx语音芯片是一款…...

golang游戏服务器 - tgf系列课程06

游戏配置 使用框架提供的游戏配置工具,只要两步,开箱即用需求描述 沿用上一节课的案例, 创建道具表,通过道具id在道具服中获取配置中道具的名称Excel 创建配置表根据项目文档中进阶教程目录下ExcelToJson的教程文档,创建指定格式的Excel文件. 脚本 生成脚本 func main() {//…...

【Canvas】记录一次从0到1绘制风场空间分布图的过程

前言 &#x1f4eb; 大家好&#xff0c;我是南木元元&#xff0c;热衷分享有趣实用的文章&#xff0c;希望大家多多支持&#xff0c;一起进步&#xff01; &#x1f345; 个人主页&#xff1a;南木元元 目录 背景 前置知识 风场数据 绘制风场 准备工作 生成二维网格 获取…...

如何用gpt改写文章 (1) 神码ai

大家好&#xff0c;今天来聊聊如何用gpt改写文章 (1)&#xff0c;希望能给大家提供一点参考。 以下是针对论文重复率高的情况&#xff0c;提供一些修改建议和技巧&#xff1a; 如何用GPT改写文章 一、引言 随着人工智能技术的飞速发展&#xff0c;自然语言处理领域取得了重大突…...

IDEA版SSM入门到实战(Maven+MyBatis+Spring+SpringMVC) -Spring依赖注入数值问题

第一章 Spring依赖注入数值问题 1.1 字面量数值 数据类型&#xff1a;基本数据类型及包装类、String语法&#xff1a;value属性或value标签 1.2 CDATA区 语法&#xff1a;<![CDATA[]]>作用&#xff1a;在xml中定义特殊字符时&#xff0c;使用CDATA区 1.3 外部已声明…...

egen3 rowwise().maxCoeff()的使用

1、安装eigen3 2、引用头文件 3、代码测试 MatrixXf aaa(2, 4);aaa << 1, 2, 3, 4, 5, 6, 7, 8; Vector2f diff(10, 20);aaa.colwise() diff;std::cout << "new_aaa : " << aaa << endl; 全部代码&#xff1a; int main() {MatrixXf …...

关于Pytorch和Numpy中的稀疏矩阵sparse的知识点

Pytorch和Numpy中的稀疏矩阵sparse 0 稀疏矩阵类别0.1 coo_matrix0.2 dok_matrix0.3 csr_matrix0.4 csc_matrix0.5 bsr_matrix0.6 bsc_matrix0.7 lil_matrix0.8 dia_matrix 1 pytorch中的稀疏矩阵1.1 to_sparse()1.2 to_sparse_csr()1.3 sparse_coo_tensor()1.4 sparse_csr_ten…...

2024年AI云计算专题研究报告:智算带来的变化

今天分享的人工智能系列深度研究报告&#xff1a;《2024年AI云计算专题研究报告&#xff1a;智算带来的变化》。 &#xff08;报告出品方&#xff1a;华泰证券&#xff09; 报告共计&#xff1a;32页 Al 云计算 2024:关注智算带来的新变化 通过对海内外主要云厂商及其产业链…...

孩子还是有一颗网安梦——Bandit通关教程:Level 5 → Level 6

&#x1f575;️‍♂️ 专栏《解密游戏-Bandit》 &#x1f310; 游戏官网&#xff1a; Bandit游戏 &#x1f3ae; 游戏简介&#xff1a; Bandit游戏专为网络安全初学者设计&#xff0c;通过一系列级别挑战玩家&#xff0c;从Level0开始&#xff0c;逐步学习基础命令行和安全概念…...

vue2-elementUI部分组件样式修改

el-radio样式&#xff1a; /deep/ .el-radio__input .el-radio__inner {width: 20px;height: 20px;position: relative;cursor: pointer;-webkit-appearance: none;-moz-appearance: none;appearance: none;border: 1px solid #999;border-radius: 0;outline: none;transition…...