malloc、calloc、realloc、free函数的使用及注意事项

malloc函数

malloc函数的返回值为void*类型

内存管理函数操作的内存是在堆区空间

malloc函数使用示例

free(p)相当于值传递,不能改变p本身。

free只是释放了空间,释放后p依然指向原地址,故需要手动置NULL。

calloc函数

calloc可以指定开辟n个指定类型的空间,开辟后初始化开辟空间数据为0。

只有calloc开辟空间时会初始化空间。像malloc和realloc开辟空间后的数据为随机值。

realloc

若realloc开辟失败,原开辟空间位置找不到且原空间没有释放,故需要用另一个指针接收,

确认开辟成功后再将新空间的起始地址赋给p。且只有calloc会初始化空间,realloc和malloc不会初始化空间。 

realloc函数的参数为NULL时,等价于malloc函数

动态分配的常见错误

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

开辟空间有可能失败,如果不去判断malloc函数的返回值直接赋值,就有可以对NULL指针的解引用操作。

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

如果越界访问程序会崩溃

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

上述代码问题1:如果对非动态开辟内存使用free释放,程序会崩溃

上述代码问题2:如果p的指向发生改变,则原开辟空间就找不到了,即出现内存泄漏问题。

动态开辟空间的释放

上述代码如果不用free主动释放,则直到程序结束,由操作系统回收。

4.用free释放部分空间

用free释放部分空间,程序会崩溃。

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

如果连续free(p)两次,程序就会崩溃。

但free(p)一次后就将p置空指针则再次free(p)就不会报错,因为free(NULL)则free函数什么都不干。

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

p是一个局部变量,函数结束之后就会将p销毁,就再也找不到开辟的空间了。

习题1

p是str的一份临时拷贝

修改方法(不考虑在GetMemory函数中开辟空间失败的情况)

方法1

申请完空间记得要释放空间(free(str); str = NULL;)

方法2

直接不要参数,直接返回一个指针。

习题2

GetMemory函数调用返回后(原空间被销毁),该函数的函数栈帧开辟空间将被printf函数开辟栈帧空间覆盖,故原p指向的空间为随机值。

简单例子(返回栈空间地址)

修改方法

习题3

运行后正常打印hello

上述代码存在的问题:

1.动态开辟的空间没有释放。

2.在GetMemory函数中开辟空间最好要判断一下是否开辟成功。

修改方法

习题4

原开辟空间使用完释放后没有将str置为空指针,此时str就是野指针,使用则造成非法访问

修改方法

free函数释放完空间后记得要将原来指针置为NULL。

柔性数组

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

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

相关文章

尽量避免删改List

作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO 联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬 学习必须往深处挖&…

C# 使用ZXing.Net生成二维码和条码

写在前面 条码生成是一个经常需要处理的功能,本文介绍一个条码处理类库,ZXing用Java实现的多种格式的一维二维条码图像处理库,而ZXing.Net是其.Net版本的实现。 在WinForm下使用该类库需要从NuGet安装两个组件: ZXing.Net ZXing…

PPT录制视频的方法,轻松提升演示效果!

在现代工作和学习中,ppt是一种常见的演示工具,而将ppt转化为视频形式更能方便分享和传播。本文将介绍两种ppt录制视频的方法,每一种方法都将有详细的步骤和简要的介绍,通过这些方法,你可以轻松将ppt制作成视频&#xf…

CSS 缩减中心动画

<template><!-- mouseenter"startAnimation" 表示在鼠标进入元素时触发 startAnimation 方法。mouseleave"stopAnimation" 表示在鼠标离开元素时触发 stopAnimation 方法。 --><!-- 容器元素 --><div class"container" mou…

OCP NVME SSD规范解读-4.NVMe IO命令-1

针对NVMe-IO-1到NVMe-IO-14的解读如下&#xff1a; NVMe-IO-1&#xff1a; 设备应支持所有必需的NVMe I/O命令。这是设备能够进行基本数据读写操作的基础要求。NVMe I/O命令包括读、写、删除、擦除等操作&#xff0c;这些是存储设备的核心功能。 NVMe-IO-2&#xff1a; 设备应…

基于STM32的光电传感器应用开发实例

基于STM32的光电传感器应用开发是一种常见的嵌入式系统应用&#xff0c;光电传感器可以用于检测物体的有无、位置、颜色、亮度等信息&#xff0c;被广泛应用于工业自动化、机器人技术、智能家居等领域。本文将介绍如何在STM32上进行光电传感器应用开发&#xff0c;并提供相应的…

Linux之定时任务调度

crond crond是Linux系统中的一个守护进程&#xff0c;主要用于周期性地执行某种任务或等待处理某些事件。而crondtab是配套的工作&#xff0c;用于定时任务的设置。 语法 crontab [选项]常用选项 入门案例 执行crontab -e命令输入任务到调度文件中 */1 * * * * ls -l /et…

RIP路由协议配置实验

实验目的&#xff1a; &#xff08;1&#xff09;理解RIP路由的原理&#xff1b; &#xff08;2&#xff09;掌握RIP路由的配置方法 实验器材&#xff1a; Cisco packet 实验内容&#xff1a; 实验步骤&#xff1a; &#xff08;1&#xff09;布置拓扑&#xff1a; &…

Go语言学习第二天

Go语言数组详解 var 数组变量名 [元素数量]Type 数组变量名&#xff1a;数组声明及使用时的变量名。 元素数量&#xff1a;数组的元素数量&#xff0c;可以是一个表达式&#xff0c;但最终通过编译期计算的结果必须是整型数值&#xff0c;元素数量不能含有到运行时才能确认大小…

Elasticsearch:升级索引以使用 ELSER 最新的模型

在此 notebook 中&#xff0c;我们将看到有关如何使用 Reindex API 将索引升级到 ELSER 模型 .elser_model_2 的示例。 注意&#xff1a;或者&#xff0c;你也可以通过 update_by_query 来更新索引以使用 ELSER。 在本笔记本中&#xff0c;我们将看到使用 Reindex API 的示例。…

flutter 之proto

和嵌入式用proto协议来通信&#xff0c;以mac来演示 先在电脑上安装protobuf&#xff08;在博主文章内容里面搜Mac安装protobuf&#xff09;&#xff0c;然后在桌面上放这几个文件&#xff0c;且build_proto_dart.sh文件内容如图所示 #!/bin/bashSCRIPT$(readlink -f "$0…

vue3+ts+vite自定义组件上传npm流程

1. 创建项目 npm create vite 这里踩坑点&#xff1a; 运行vite生成的vue项目时报错“SyntaxError: Unexpected token ?? at “ 是因为node版本过低 电脑为windows11系统&#xff0c;我当时使用的版本node版本是14.21.3&#xff0c;如下图&#xff0c;后边安装了nvm版本…