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

【C语言】动态内存管理:详解malloc和free函数

前言

        在C语言编程中,动态内存分配是一个非常重要的概念。与静态内存分配不同,动态内存分配允许程序在运行时根据需要分配和释放内存,从而更加灵活地管理内存资源。特别是在一些数据结构的引用中经常需要使用,下面我们就详细讲解一下malloc函数和free函数。

malloc函数

        malloc是"memory allocation"的缩写,释义是内存分配。该函数主要用于动态内存的分配,其位于<stdlib.h>头文件中。

函数原型

void *malloc(size_t size);

size:要分配内存块的大小,以字节为单位。

返回值

  • 分配成功返回已分配的内存指针
  • 分配失败返回NULL

在实际使用中,我们一般会以这种形式写:

elemtype *a=(elemtype *)malloc(n * sizeof(elemtype));

elemtype表示任意数据类型

n是一个正整数

sizeof是内存空间计算函数,返回值是字节数

        该语句含义是,创建了一个elemtype类型的指针a,其指向的内存是分配的一块elemtype类型空间,空间大小为n个elemtype类型的数据类型大小

示例代码

#include <stdio.h>
#include <stdlib.h>int main() {// 分配10个整数的内存空间int *arr = (int *)malloc(10 * sizeof(int));if (arr == NULL) {printf("内存分配失败
");return 1;}return 0;
}

free函数

free释义释放,用于释放之前malloc等函数分配的内存

函数原型

void free(void *ptr);

ptr:指向要释放的内存块指针

注意事项

  • 一旦内存被释放,指针仍然持有原来的地址,但该地址上的内存不再有效,再次访问可能导致未定义行为。
  • 释放空指针是安全的,不会导致错误。
  • 重复释放同一块内存(悬垂指针)会导致未定义行为

示例代码

#include <stdio.h>
#include <stdlib.h>int main() {// 分配内存int *arr = (int *)malloc(10 * sizeof(int));if (arr == NULL) {printf("内存分配失败
");return 1;}// 使用分配的内存for (int i = 0; i < 10; i++) {arr[i] = i;}// 释放内存free(arr);// 避免悬垂指针问题,将指针设置为NULLarr = NULL;return 0;
}

 

malloc 和 free 的使用技巧和最佳实践

  1. 检查返回值: 在使用 malloc 分配内存后,始终检查返回值是否为 NULL,以确保内存分配成功。
  2. 及时释放内存: 确保在不再需要动态分配的内存时及时调用 free 释放内存,以避免内存泄漏。
  3. 避免悬垂指针: 释放内存后,将指针设置为 NULL,防止后续代码误用已释放的内存。
  4. 匹配类型转换: 在使用 malloc 分配内存时,通常需要进行类型转换,例如 (int *)malloc(...)。虽然在C语言中可以省略类型转换,但明确转换可以提高代码的可读性和安全性。

总结

    malloc free 是C语言中进行动态内存管理的两个核心函数。正确使用它们能够提高程序的灵活性和效率,但也需要注意潜在的内存管理问题,如内存泄漏和悬垂指针。通过遵循最佳实践和编写健壮的代码,可以有效地管理和利用动态内存,提升程序的稳定性和性能。

相关文章:

【C语言】动态内存管理:详解malloc和free函数

前言 在C语言编程中&#xff0c;动态内存分配是一个非常重要的概念。与静态内存分配不同&#xff0c;动态内存分配允许程序在运行时根据需要分配和释放内存&#xff0c;从而更加灵活地管理内存资源。特别是在一些数据结构的引用中经常需要使用&#xff0c;下面我们就详细讲解一…...

EGO Swarm翻译

目录 摘要 Ⅰ 介绍 Ⅱ 相关工作 A . 单四旋翼局部规划 B . 拓扑规划 C. 分布式无人机集群 Ⅲ 基于梯度的局部规划隐式拓扑轨迹生成 A.无需ESDF梯度的局部路径规划 B.隐式拓扑轨迹生成 Ⅳ 无人机集群导航 A 机间避碰 B. 定位漂移补偿 C. 从深度图像中去除agent Ⅴ …...

Linux根目录

在Linux系统中&#xff0c;文件系统遵循一种标准化的目录结构&#xff0c;即文件系统层次结构标准&#xff08;Filesystem Hierarchy Standard&#xff0c;FHS&#xff09;。 根目录&#xff08;/&#xff09; /bin&#xff1a;包含二进制可执行文件&#xff0c;通常是用户和系…...

SAP-SD-参照退货订单补货时带不出行项目

业务场景&#xff1a; 当物料出现质量问题时&#xff0c;客户需要换货&#xff0c;不需要退款&#xff0c;就需要先做退货订单&#xff0c;然后参照退货订单进行补货&#xff0c;创建补货订单&#xff0c;但是创建补货订单时只是把抬头数据带入补货订单&#xff0c;没有带入行项…...

12-C语言单向链表

一、链表的概述 1.链表与数组对比 遍历数组中的数据&#xff0c;查询数据比较方便&#xff0c;但往数组中插入、删除数据需要移动大量数据&#xff1b;相反。链表遍历、查询数据不方便&#xff0c;但是插入、删除数据比较方便&#xff0c;不需要移动大量数据&#xff0c;直接…...

2024年11月 蓝桥杯青少组 STEMA考试 Scratch真题

2024年11月 蓝桥杯青少组 STEMA考试 Scratch真题&#xff08;选择题&#xff09; 题目总数&#xff1a;5 总分数&#xff1a;50 选择题 第 1 题 单选题 Scratch运行以下程宇后&#xff0c;小兔子会&#xff08; &#xff09;。 A. 变小 B. 变大 C. 变色 D. …...

FFmpeg 4.3 音视频-多路H265监控录放C++开发二十一.2,RTP协议-RTP协议概述,协议详情

前提: 为什么要学习 RTP&#xff08;Real-time Transport Protocol&#xff09;重点 简介&#xff1a;RTP是一个实时传输媒体数据的协议&#xff0c;通常与RTSP一起使用。它负责在网络上传输音视频数据。特点&#xff1a;RTP通过UDP或TCP传输媒体数据&#xff0c;提供时间戳和序…...

Linux系统编程——系统内核中的信号

目录 一、前言 二、系统内核中的信号 三、sigset_t 四、信号集操作 1、sigpending(); 2、sigemptyset(); 3、sigfillset(sigset_t *set); 4、int sigaddset ()和sigdelset() ​编辑 5、sigismember() 6、sigprocmask() 五、信号集操作代码演示 六、深入理解进程的信…...

delve调试环境搭建—golang

原文地址&#xff1a;delve调试环境搭建—golang – 无敌牛 欢迎参观我的个人博客&#xff1a;无敌牛 – 技术/著作/典籍/分享等 由于平时不用 IDE 开发环境&#xff0c;习惯在 linux终端vim 环境下开发&#xff0c;所以找了golang的调试工具&#xff0c;delve类似gdb的调试界…...

shell脚本的循环-----while和for循环

一、while 1.格式 while 条件表达式; do 命令 done 2.案例 &#xff1a; ping测试子网段的主机网段由用户输入&#xff0c;例如用户输入192.168.101 &#xff0c;则ping192.168.101.125 — 192.101.131 UP&#xff1a; /tmp/host_up.txt Down: /tmp/host_down.txt &#…...

【游戏设计原理】21 - 解谜游戏的设计

你想象一下&#xff0c;刚坐下准备玩游戏&#xff0c;想着“今天得挑战一下我的智商极限&#xff01;”可结果碰上一个谜题&#xff0c;傻眼了&#xff0c;心里默念&#xff1a;“这啥玩意儿&#xff1f;这游戏是在玩我吗&#xff1f;”如果这个谜题太简单了&#xff0c;你可能…...

【漏洞复现】Wordpress GutenKit 插件 远程文件写入致RCE漏洞复现(CVE-2024-9234)

🏘️个人主页: 点燃银河尽头的篝火(●’◡’●) 如果文章有帮到你的话记得点赞👍+收藏💗支持一下哦 一、漏洞概述 1.1漏洞简介 漏洞名称:Wordpress GutenKit 插件 远程文件写入致RCE漏洞复现漏洞编号:CVE-2024-9234漏洞威胁等级:超危影响范围:GutenKit <= 2.1.0…...

深度学习任务简介:分类、回归和生成

深度学习任务简介&#xff1a;分类、回归和生成 文章目录 深度学习任务简介&#xff1a;分类、回归和生成一、分类任务&#xff08;Classification Task&#xff09;什么是分类任务&#xff1f;**分类任务的常见应用**分类任务的输出主要算法 二、回归任务&#xff08;Regressi…...

【测试】Unittest

近期更新完毕&#xff0c;建议关注收藏&#xff01; 目录 简介TestCaseTestSuiteTestRunnerTestLoaderFixture tips:ctrl? 可以看方法的help文档 简介 python自带的单元测试框架&#xff0c;也可以做自动化测试 组织多个用例去执行&#xff0c;用例都是用单独的目录存放的 丰…...

java 根据路径下载文件转换为MultipartFile,并且上传到服务器

直接上代码 controller层 GetMapping("/downloadAndUploadAttachment")UpdateOperationLogging(msg "根据路径下载文件转换为MultipartFile,并且上传到服务器")Operation(summary "根据路径下载文件转换为MultipartFile,并且上传到服务器", de…...

Onvif服务端开发

实现了Onvif服务端的设备搜索和RTSP流的功能。用 ONVIF Device Manager 测试工具可以成功搜索到设备和获取到RTSP流&#xff0c;有的路由器可能不支持239.255.255.250组播&#xff0c;我一开始用的电信的那种光猫路由器二合一的&#xff0c;一直搜不到设备&#xff0c;后面用So…...

【jvm】主要参数

Java 虚拟机&#xff08;JVM&#xff09;有许多参数用于控制其行为和性能&#xff0c;下面是一些 主要的 JVM 启动参数&#xff0c;这些参数通常分为以下几类&#xff1a; 内存管理相关参数 这些参数主要用来配置 JVM 的内存分配策略、堆内存、栈内存等。 -Xms 设置 JVM 启动…...

【优选算法】—移动零(双指针算法)

云边有个稻草人-CSDN博客 想当一名牛的程序员怎么能少的了练习算法呢&#xff1f;&#xff01; 今天就立即开启一个新专栏&#xff0c;专干算法&#xff0c;提高算法能力&#xff08;废柴的我也在准备蓝桥杯哈哈&#xff09;—— 目录 1.【 283. 移动零 - 力扣&#xff08;Lee…...

PostgreSQL标识符长度限制不能超过63字节

文章目录 问题&#xff1a;标识符太长会被截断分析相关源码可以尝试以下案例 问题&#xff1a;标识符太长会被截断 在创建表时&#xff0c;发现表名太长会自动被截断&#xff0c;导致查询表时报错了。 分析 参考&#xff1a;https://www.postgresql.org/docs/current/limits…...

嵌入式硬件面试题

1、请问什么是通孔、盲孔和埋孔&#xff1f;孔径多大可以做机械孔&#xff0c;孔径多小必须做激光孔&#xff1f;请问激光微型孔可以直接打在元件焊盘上吗&#xff0c;为什么&#xff1f; 通孔是贯穿整个PCB的过孔&#xff0c;盲孔是从PCB表层连接到内层的过孔&#xff0c;埋孔…...

Oracle查询表空间大小

1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

Neo4j 集群管理:原理、技术与最佳实践深度解析

Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

大数据学习(132)-HIve数据分析

​​​​&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4…...

Java线上CPU飙高问题排查全指南

一、引言 在Java应用的线上运行环境中&#xff0c;CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时&#xff0c;通常会导致应用响应缓慢&#xff0c;甚至服务不可用&#xff0c;严重影响用户体验和业务运行。因此&#xff0c;掌握一套科学有效的CPU飙高问题排查方法&…...

Java求职者面试指南:计算机基础与源码原理深度解析

Java求职者面试指南&#xff1a;计算机基础与源码原理深度解析 第一轮提问&#xff1a;基础概念问题 1. 请解释什么是进程和线程的区别&#xff1f; 面试官&#xff1a;进程是程序的一次执行过程&#xff0c;是系统进行资源分配和调度的基本单位&#xff1b;而线程是进程中的…...

数学建模-滑翔伞伞翼面积的设计,运动状态计算和优化 !

我们考虑滑翔伞的伞翼面积设计问题以及运动状态描述。滑翔伞的性能主要取决于伞翼面积、气动特性以及飞行员的重量。我们的目标是建立数学模型来描述滑翔伞的运动状态,并优化伞翼面积的设计。 一、问题分析 滑翔伞在飞行过程中受到重力、升力和阻力的作用。升力和阻力与伞翼面…...

Axure 下拉框联动

实现选省、选完省之后选对应省份下的市区...

如何把工业通信协议转换成http websocket

1.现状 工业通信协议多数工作在边缘设备上&#xff0c;比如&#xff1a;PLC、IOT盒子等。上层业务系统需要根据不同的工业协议做对应开发&#xff0c;当设备上用的是modbus从站时&#xff0c;采集设备数据需要开发modbus主站&#xff1b;当设备上用的是西门子PN协议时&#xf…...

深度解析:etcd 在 Milvus 向量数据库中的关键作用

目录 &#x1f680; 深度解析&#xff1a;etcd 在 Milvus 向量数据库中的关键作用 &#x1f4a1; 什么是 etcd&#xff1f; &#x1f9e0; Milvus 架构简介 &#x1f4e6; etcd 在 Milvus 中的核心作用 &#x1f527; 实际工作流程示意 ⚠️ 如果 etcd 出现问题会怎样&am…...

C++11 constexpr和字面类型:从入门到精通

文章目录 引言一、constexpr的基本概念与使用1.1 constexpr的定义与作用1.2 constexpr变量1.3 constexpr函数1.4 constexpr在类构造函数中的应用1.5 constexpr的优势 二、字面类型的基本概念与使用2.1 字面类型的定义与作用2.2 字面类型的应用场景2.2.1 常量定义2.2.2 模板参数…...