动态内存管理4大函数的进阶

𝙉𝙞𝙘𝙚!!👏🏻‧✧̣̥̇‧✦👏🏻‧✧̣̥̇‧✦ 👏🏻‧✧̣̥̇:Solitary-walk

      ⸝⋆   ━━━┓
     - 个性标签 - :来于“云”的“羽球人”。 Talk is cheap. Show me the code
┗━━━━━━━  ➴ ⷯ

本人座右铭 :   欲达高峰,必忍其痛;欲戴王冠,必承其重。

👑💎💎👑💎💎👑 
💎💎💎自💎💎💎
💎💎💎信💎💎💎
👑💎💎 💎💎👑    希望在看完我的此篇博客后可以对你有帮助哟

👑👑💎💎💎👑👑   此外,希望各位大佬们在看完后,可以互赞互关一下,看到必回
👑👑👑💎👑👑👑


 目录:

一:前言

二:malloc( )

三:free( )

四:calloc( )

五:realloc( ) 

六:经典错误


一:前言

在此之前,我们一直都是通过创建变量和数组的方式来进行空间的开辟

不知道我们是否想过这样一个问题:

当我们对数组的空间开的过小或者是过大怎么办?数组空间过大会造成空间浪费而空间国小会对后续的程序产生一些问题。

这时候我们或许就会问:那有没有一些相关的函数对内存的申请是按需开辟的?

接下来我们介绍动态内存管理的4个相关函数

二:malloc( )

 1)malloc的参数:必须指定要开辟空间的大小,单位是字节

2)函数若开辟成功会返回指向这个开辟空间的指针

3)函数若开辟失败会返回一个NULL

4)注意若是给参数传一个0,这是标准未定义的

5)malloc不会对开辟的空间进行初始化(随机值

 

三:free( )

 free函数功能:释放被malloc / calloc/realloc开辟出来的空间

注意:

free() 只能用于被动态内存开辟出来空间的释放,对于非动态内存开辟的空间是不可以的

free(p) 注明:p = NULL,这个是支持的

四:calloc( )

 calloc() 和malloc()相比没有什么质的不同,calloc()也是进行内存的申请,只不过参数多了一个指定的大小(多少个元素),其次就是这个函数会在返回开辟空间的地址之前默认初始化为0

 

五:realloc( )

 realloc( ) 是对内存重新进行调整,可以对指定的内存进行扩容也可以进行缩小

1)  第一个参数:指向要调整空间的地址,注意这个空间必须是被动态内存开辟出来的

2)第二个参数:调整之后新的空间大小,注意不是新增空间或者要减小空间的大小

3)当用realloc( ) 对空间进行增容会有两种情况:一个是原地扩容,另一个是异地扩容

4)当realloc 进行异地扩容的时候会进行以下操作

对原有空间的数据进行拷贝到新的空间

释放旧的空间

返回新的空间的起始地址

 

六:经典错误
1.对NULL解引用

 想一想以上代码为什么会崩了?

这就是对NULL的解引用

因为此时malloc失败,会返回空指针,即此时的 p == NULL

*p = 1;是错误的

2.动态内存的越界访问

 malloc开辟的空间就是10个int类型的数据

下面进行打印的时候是对100个数据进访问,这就造成了动态内存的越界访问

3.对动态开辟内存的多次free

 但是当我第一次free后,对p及时置空,后面在进行多次的free就没有问题

因为这是free( )函数支持的

4.释放动态开辟内存的一部分

这是不支持的

5对非动态内存的释放

结语:

对于动态内存开辟相关的4大函数,在数据结构的学习中是非常重要的,因为数据结构对数据的管理主要是在堆上进行的,到时候你就看吧,以写一个不吱声,很容易出现内存管理的报错,当然程序出现崩溃是必不可少的,所以对动态内存管理咱们一定要打好基础,当然我也希望各位老铁们在看到我的此篇博客后可以对动态内存管理有一定自己的了解

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

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

相关文章

用C语言实现哈希表HashMap

代码仓库地址 1. 功能说明 自定义初始容量和负载因子;当键值对的个数与容量比值超过负载因子时,自动扩容;借鉴Java8的HashMap部分扩容逻辑,定义了单独的桶结构体用于记录hash值,以及2倍扩容,减少了hash运算…

JDK17

JDK 17是Java开发工具包(Java Development Kit)的一个版本。JDK是用于开发和运行Java应用程序的软件包,它包含了编译器、调试器、运行时环境和其他一些实用工具。JDK 17是Java的最新版本,它提供了许多新的功能、增强和改进。 使用…

Python二级:二叉树问题求解

一、题源 在Python二级考试中前10道基础题是必考题,虽然没有什么卵用,但是你得分不达标,还不让你过,没有办法只好硬着头皮去刷题了。这10道题中有一个二叉树题比较难,现摘录如下,同时给出gpt-4的解答&…

在 Centos 7.9 中,安装与配置 Docker 20.10.18

1. 检测内核版本 在使用Docker之前,首先需要确保系统内核版本达到3.10以上。可以通过以下命令检查: uname -r2. 升级内核及软件包 为了确保系统的稳定性和安全性,建议在安装Docker之前先升级系统内核和相关软件包: yum -y upd…

zustand状态管理工具(react)

分别创建文件continue.js、shoes.js 1、continue.js import create from zustand import { persist } from zustand/middlewareexport default create(persist((set) > ({counter: 12,incrementer: () > set((state) > ({ counter: state.counter 1 })),decrementer…

ruoyi后台管理系统部署-3-安装redis

centos7安装redis 1. yum 安装 查看是否安装了redis yum installed list | grep redis ps -ef | grep redis安装epel 仓库(仓库是软件包下载的,类似maven,nuget) yum install epel-release搜索 redis 包 yum search redis安装…

逸学Docker【java工程师基础】1.认识docker并且安装

场景问题 在实际开发过程中我们有这样的场景问题 在开发阶段的环境配置到了其他人项目人员那里就不能运行了,尽管配置规格相同,但是在较多的不同的环境情况下还是可能会有错误。 开发:程序员:你那边可以运行了吗 测试&#xf…

爬虫补环境jsdom、proxy、Selenium案例:某条

声明: 该文章为学习使用,严禁用于商业用途和非法用途,违者后果自负,由此产生的一切后果均与作者无关 一、简介 爬虫逆向补环境的目的是为了模拟正常用户的行为,使爬虫看起来更像是一个真实的用户在浏览网站。这样可以…

前端基础知识整理汇总(下)

react 生命周期 React v16.0前的生命周期 初始化(initialization)阶段 此阶段只有一个生命周期方法:constructor。 constructor() 用来做一些组件的初始化工作,如定义this.state的初始内容。如果不初始化 state 或不进行方法绑定,则不需…

编程艺术之Unix哲学

Unix 哲学不算是一种正规设计方法,它并不打算从计算机科学的理论高度来产生理论上完美的软件。那些毫无动力、松松垮垮而且薪水微薄的程序员们,能在短短期限内,如神灵附体般开发出稳定而新颖的软件——这只不过是经理人永远的梦呓罢了。 1 Un…

Leetcode 3008. Find Beautiful Indices in the Given Array II

Leetcode 3008. Find Beautiful Indices in the Given Array II 1. 解题思路2. 代码实现 题目链接:3008. Find Beautiful Indices in the Given Array II 1. 解题思路 这一题其实算是套路题了,知道的话就挺快的,不知道的话就会很难了…… …

isis实验

根据要求制作大概: 使用isis配置路由器: 配置好物理接口地址后配置isis 为实现r1访问r5的环回走r6,需要在r6上制作路由泄露: 在r5上产生r1的路由明细: 全网可达:

华为 HarmonyOS 页面跳转

HarmonyOS 页面跳转 1.新建页面2.添加跳转方法3.实现跳转效果 1.新建页面 我们新建2个页面(page),一个Hello World页面,一个Hello HarmonyOS页面,注意修改红色框内容,保持一致 2.添加跳转方法 导入导入router模块,页…

Rust-内存安全

堆和栈 一个进程在执行的时候,它所占用的内存的虚拟地址空间一般被分割成好几个区域,我们称为“段”(Segment)。常见的几个段如下。 代码段。编译后的机器码存在的区域。一般这个段是只读的。bss段。存放未初始化的全局变量和静态变量的区域。数据段。…

MATLAB Deep learning

文章目录 Chapter 1: Machine Learning存在的问题过拟合Overfitting解决过拟合 regularization and validationregularization 正则化validation 验证 机器学习的类型有监督学习分类Classification回归Regression 无监督学习聚类 强化学习 Chapter 2: Neural NetworkChapter 3:…

(BUUCTF)ycb_2020_easy_heap (glibc2.31的off-by-null + orw)

文章目录 前置知识整体思路高版本的off-by-nullorw exp 前置知识 未初始化内存导致的地址泄露 高版本下的off-by-null利用 glibc2.31下的orw做法 整体思路 非常综合的一道题目,和ciscn之前做过的一道silverwolf很相似,本道题目的glibc2.31的环境也让…

如何使用設置靜態住宅IP

靜態住宅IP就是一種靜態的、分配給住宅用戶的IP地址。與動態IP地址不同,靜態住宅IP一旦分配給用戶,就會一直保持不變,除非ISP(Internet Service Provider,互聯網服務提供商)進行手動更改。那麼,…

Django教程第6章 | web开发实战-文件上传(导入文件、上传图片)

专栏系列&#xff1a;Django学习教程 导入文件 目标&#xff1a;导入部门清单excel&#xff0c;解析excel数据存储到数据库。 1.准备要导入的excel文件 2.编写模板HTML <div class"panel panel-default"><!-- Default panel contents --><div class…

Embedding Watermarks into Deep Neural Networks

将水印嵌入深度神经网络 ABSTRACT 最近在深度神经网络领域取得了显著的进展。分享深度神经网络的训练模型对于这些系统的快速研究课并发进展至关重要。与此同时&#xff0c;保护共享训练模型的权利也变得十分必要。为此我们提议使用数字水印技术来保护知识产权&#xff0c;并…

vue3-模板引用

//1.调用ref函数 -> ref对象 const h1Ref ref(null) const comRef ref(null) //组件挂载完毕之后才能获取 onMounted(()>{console.log(h1Ref.value);console.log(comRef.value); })<div class"father"><!-- 通过ref标识绑定ref对象 --><h2 re…