C语言-内存管理

1、malloc()函数

        用于动态分配一块指定大小的内存,并返回指向这块内存的指针。如果分配失败,

        返回 NULL。 

int* ptr = (int*)malloc(sizeof(int) * 10);  // 分配一个包含 10 个整数的内存
if (ptr == NULL) {
    printf("Memory allocation failed!\n");
}

2、free() 函数

        用于释放之前通过 malloc()calloc()realloc() 分配的内存。释放内存后,

        指针仍然存在,但指向的内存不再有效。因此,通常会将指针设置为 NULL 以避免悬空指针。

free(ptr);  // 释放之前分配的内存
ptr = NULL;  // 防止使用悬空指针

3、内存溢出、内存越界

        内存存放的数据空间超过申请空间大小,操作超过申请空间大小。 

4、 内存泄漏

        如果分配的内存没有被及时释放,程序将消耗越来越多的内存,导致系统性能下降,

        甚至崩溃。这种现象被称为“内存泄漏”。

        为防止内存泄漏

                确保每次调用 malloc()后都要有相应的 free() 调用。

5、堆和栈的区别

        

1. 内存分配方式

  • 栈(Stack)

    • 内存的分配是自动管理的,遵循先进后出(LIFO)原则。
    • 当函数被调用时,相关的局部变量和参数会在栈上分配内存;当函数返回时,这部分内存会自动释放。
  • 堆(Heap)

    • 内存的分配是手动管理的,通过程序员调用特定的内存分配函数(如 malloc 或 new)。
    • 堆中的内存可以在程序的任何地方分配和释放,程序员需要显式释放使用 free 或 delete

2. 生命周期

    • 栈内存中的变量的生命周期仅限于它们被创建的函数调用,函数返回后,内存会自动释放。
    • 堆内存中的变量的生命周期是由程序员控制的,可以在需要时分配,直到显式释放为止。

3. 内存大小

    • 栈的大小通常是有限的,具体大小取决于操作系统和编译器的设置,通常为几 MB。
    • 堆的大小通常比栈大,受限于系统的可用内存。程序可以动态请求更大的内存块。

4. 存储内容

    • 存储的是函数的局部变量、参数、返回地址等临时数据。
    • 存储的是动态分配的对象和数据结构,如链表、树等,通常用于需要动态大小的情况。

5. 访问速度

    • 栈的访问速度较快,因为其分配和释放是简单的指针移动。
    • 堆的访问速度相对较慢,因为分配和释放需要更多的时间进行内存管理和找寻适合的内存块。

6. 错误处理

    • 栈溢出(stack overflow)可能导致程序崩溃,通常是在递归调用或分配太多局部变量时发生。
    • 堆溢出(memory leak)通常是由于未释放的内存,导致消耗过多内存,增加了程序崩溃的风险。

总结

栈和堆是内存管理中不可或缺的部分,各自适用于不同的场景。栈适合用于存储临时数据,速度快且管理简单,而堆适合存储大量不确定大小的动态数据,虽然需要更多的管理工作。了解它们的区别对于优化程序性能和避免内存问题至关重要。

      

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于ESP32-IDF驱动GPIO输出控制LED

基于ESP32-IDF驱动GPIO输出控制LED 文章目录 基于ESP32-IDF驱动GPIO输出控制LED一、点亮LED3.1 LED电路3.2 配置GPIO函数gpio_config()原型和头文件3.3 设置GPIO引脚电平状态函数gpio_set_level()原型和头文件3.4 代码实现并编译烧录 一、点亮LED 3.1 LED电路 可以看到&#x…

YOLOv5训练自己的数据及rknn部署

YOLOv5训练自己的数据及rknn部署 一、下载源码二、准备自己的数据集2.1 标注图像2.2 数据集结构 三、配置YOLOv5训练3.1 修改配置文件3.2 模型选择 四、训练五、测试六、部署6.1 pt转onnx6.2 onnx转rknn 七、常见错误7.1 训练过程中的错误7.1.1 cuda: out of memory7.1.2 train…

MATLAB 如何避免复杂shp文件对inpolygon的影响

**任务描述:**当我想用inpolygon函数将属于非洲的pixel选出来时,发现因为周边小岛的影响,pixel选取有问题,如下图。 第一种解决办法: 首先将复杂shp文件查分成简单的shp文件,即将不相交的元素分离开 [QGIS…

2025.01春节可用两个带源的TV直播软件

电视直播pro 2.612 论坛的分享: https://tieba.baidu.com/p/9183010315 我的网盘 http://pan.ezdial.cn/nasone/tvbox/%E7%94%B5%E8%A7%86%E7%9B%B4-pro.apk 这个软件挺牛逼的,因为虽然有直播购物,但是里面的频道是真好,有电影解说有电视剧, 最后还能自定义播放源. 唯一不足找…

Ubuntu24.04初始化MySQL报错 error while loading shared libraries libaio.so.1

Ubuntu24.04初始化MySQL报错 error while loading shared libraries: libaio.so.1 问题一:libaio1不存在 # 提示libaio1不存在 [rootzabbix-mysql-master.example.com x86_64-linux-gnu]#apt install numactl libaio1 Reading package lists... Done Building depe…

【Linux】其他备选高级IO模型

其他高级 I/O 模型 以上基本介绍的都是同步IO相关知识点,即在同步I/O模型中,程序发起I/O操作后会等待I/O操作完成,即程序会被阻塞,直到I/O完成。整个I/O过程在同一个线程中进行,程序在等待期间不能执行其他任务。下面…

RV1126+FFMPEG推流项目源码

源码在我的gitee上面,感兴趣的可以自行了解 nullhttps://gitee.com/x-lan/rv126-ffmpeg-streaming-projecthttps://gitee.com/x-lan/rv126-ffmpeg-streaming-project

VMware虚拟机克隆或复制linux后无法上网的解决方案

1.首先转移虚拟机到另一台电脑 【虚拟机转移】超详细的将虚拟机(ubuntu)从一台电脑复制到另一台电脑教程_虚拟机复制到另一台电脑-CSDN博客 1.先把虚拟机整个文件拷贝到另一台电脑 2。打开vmware,选择打开虚拟机,选择 .vmx 就可…

具有CLI命令和Web界面的WOL

简介 什么是 wol ? wol 是一个命令行工具,用于发送唤醒网络上设备的 Wake-On-LAN(WOL)魔法包。具有命令行界面和网页界面两种功能。本文只介绍了网页界面。 主要特点 功能:通过发送 Wake-On-LAN(WOL&…

Vue2:使用sortablejs实现el-table中行拖拽调整顺序

如图,实现拖拽表格中的行来调整行顺序,但是其中的编号仍然是1、2、3、4的顺序,不跟着变化。 实现如下: 一、导入sortablejs import Sortable from "sortablejs";export default { components: {Sortable},data() {return {//数据中的id很重要,拖拽行重新排序…

分布式光纤应变监测是一种高精度、分布式的监测技术

一、土木工程领域 桥梁结构健康监测 主跨应变监测:在大跨度桥梁的主跨部分,如悬索桥的主缆、斜拉桥的斜拉索和主梁,分布式光纤应变传感器可以沿着这些关键结构部件进行铺设。通过实时监测应变情况,能够精确捕捉到车辆荷载、风荷…

智能手机“混战”2025:谁将倒下而谁又将突围?

【潮汐商业评论原创】 “去年做手机比较艰难,几乎每个品牌都在调价、压货,像华为这种以前都不给我们分货的厂商,也开始成为我的主要库存。不过今年开头比较好,20号国补一开始,店里的人流和手机销量就明显涨了不少&…

OpenCV文字绘制支持中文显示

OpenCV版本:4.4 IDE:VS2019 功能描述 OpenCV绘制文本的函数putText()不支持中文的显示,网上很多方法推荐的都是使用FreeType来支持,FreeType是什么呢?FreeType的官网上有介绍 FreeType官网 https://www.freetype.or…

MyBatis-Plus的条件构造器和常用接口

一、wrapper介绍 Wrapper : 条件构造抽象类,最顶端父类 ​ AbstractWrapper : 用于查询条件封装,生成 sql 的 where 条件 ​ QueryWrapper : 查询条件封装 ​ UpdateWrapper : Update 条件封装 ​ Abst…

结合实例分析A2DP SBC帧结构和编解码算法

SBC也就是Sub band codec,俗称子带编码,是蓝牙A2DP必须支持的唯一编码。下面结合实例看看SBC编码数据在蓝牙传输中帧结构以及SBC的编解码算法流程: AVDTP Frame 首先AVDTP Frame是基于L2CAP协议,所以会包含有4个字节的L2CAP头部&…

接口(3)

大家好,今天我们接着上一篇的内容继续往下来看看,了解一下如何实现多个接口,与继承父类不同,一个类可以实现接口,那么话不多说,来看。 2.5实现多个接口. 在Java中,类和类之间是单继承的,一个类只能有一个…

MATLAB提供的颜色映射表colormap——伪彩色

图像处理领域的一个习惯:不是真实的颜色,一般用伪彩色。一是说明不是物体本身的颜色,二是彩色更容易分辨。 MATLAB陆续提供了16种颜色映射表colormap。 之前的都很丑,近5年新增的4种还可以。总的说来还是丑。 这是一种鸟的名字。…

网络安全 | 入侵检测系统(IDS)与入侵防御系统(IPS):如何识别并阻止威胁

网络安全 | 入侵检测系统(IDS)与入侵防御系统(IPS):如何识别并阻止威胁 一、前言二、入侵检测系统(IDS)2.1 IDS 的工作原理2.2 IDS 的技术类型2.3 IDS 的部署方式 三、入侵防御系统(…

工业“MCU+AI”

随着工业4.0的推进,传统工业设备正向智能化和自动化方向转型。这要求设备具备更高的算力、更强的实时处理能力以及支持AI算法的能力,以应对工业机器人、电机控制、预测性维护等复杂应用场景。 近年来越来越多的芯片厂商纷纷推出工业“MCUAI”产品&#…

【统计的思想】假设检验(二)

假设检验是根据人为设定的显著水平,对被测对象的总体质量特性进行统计推断的方法。 如果我们通过假设检验否定了零假设,只是说明在设定的显著水平下,零假设成立的概率比较小,并不是说零假设就肯定不成立。如果零假设事实上是成立…