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)通常是由于未释放的内存,导致消耗过多内存,增加了程序崩溃的风险。

总结

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

      

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

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

相关文章

蓝桥杯lesson3---string的使用

🌈个人主页:羽晨同学 💫个人格言:“成为自己未来的主人~” string的概念 string字符串是一种更加高级的封装,string字符串中包含了大量的方法,这些方法使得字符串的操作变得更加简单,string的使用&…

動態住宅IP提升網站訪問成功率

動態住宅IP通常與普通家庭用戶的網路連接相關聯。這種IP地址的特點在於,它是動態變化的,用戶在每次連接時可能會獲得不同的IP地址。這與靜態IP形成了鮮明對比,後者在連接期間保持不變。傳統上,IP地址分為住宅IP和數據中心IP兩類。…

进制之间转换

「 一、十进制 二进制 」 1.十进制转二进制:一直除以2直到商为0,再反向取余数。 例:13(十进制)转1101(二进制) 2.二进制转十进制:最后一位数开始是2^0,然后一直按照指数递增的方式…

3b1b线性代数基础

零、写在前面 3b1b之前没认真看,闲了整理整理。 一、向量 学习物理的时候,向量是空间中的箭头。由其方向和长度决定。 学习数据结构的时候,向量是有序的数字列表。向量的每一维度有着不同含义。 线性代数中,我们通常认为**向量…

Consul持久化配置报错1067---consul_start

报错都是文件写的有问题或者格式问题,直接复制我的这个改改地址就行 先创建文本文件consul_start.txt--->再复制代码保存---->再把.txt改成.bat 持久化存储的地址在:mydata 注:D:\consul\consul_1.20.2_windows_386改成自己consul的…

linux中关闭服务的开机自启动

引言 systemctl 是 Linux 系统中用于管理 systemd 服务的命令行工具。它可以用来启动、停止、重启服务,管理服务的开机自启动,以及查看服务的状态等。 什么是 systemd? systemd 是现代 Linux 发行版中默认的 初始化系统(init sys…

【Unity3D】Unity混淆工具Obfuscator使用

目录 一、导入工具 二、各种混淆形式介绍 2.1 程序集混淆 2.2 命名空间混淆 2.3 类混淆 2.4 函数混淆 2.5 参数混淆 2.6 字段混淆 2.7 属性混淆 2.8 事件混淆 三、安全混淆 四、兼容性处理 4.1 动画方法兼容 4.2 GUI方法兼容 4.3 协程方法兼容 五、选项 5.1 调…

tp8读取mysql导出excel

环境:php8.3, thinkphp8.0, mysql8.0 use PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\PhpSpreadsheet\Writer\Xlsx; use PhpOffice\PhpSpreadsheet\Style\Alignment; use think\facade\Db; use think\response\Json;class Index {public function index…

JavaScript学习笔记(3)

一.BOM对象 BOM的全称是Browser Object Model,翻译过来是浏览器对象模型。也就 是JavaScript将浏览器的各个组成部分封装成了对象。我们要操作浏览器的部分功能,可以通过操作 BOM对象的相关属性或者函数来完成。例如:我们想要将浏览器的地址改为 http:/…

Hive之加载csv格式数据到hive

场景: 今天接了一个需求,将测试环境的hive数据导入到正式环境中。但是不需要整个流程的迁移,只需要迁移ads表 解决方案: 拿到这个需求首先想到两个方案: 1、将数据通过insert into语句导出,然后运行脚本 …

Python OrderedDict 实现 Least Recently used(LRU)缓存

OrderedDict 实现 Least Recently used(LRU)缓存 引言正文 引言 LRU 缓存是一种缓存替换策略,当缓存空间不足时,会移除最久未使用的数据以腾出空间存放新的数据。LRU 缓存的特点: 有限容量:缓存拥有固定的…

如何在 Spring Boot 中实现自定义属性

🎬 秋野酱:《个人主页》 🔥 个人专栏:《Java专栏》《Python专栏》 ⛺️心若有所向往,何惧道阻且长 文章目录 Spring Boot 自定义属性配置指南一、引言二、使用 Value 注解读取单个配置项代码示例设置默认值 三、使用 ConfigurationPropertie…

stm32f103 单片机(一)第一个工程

先看一个简单的 系统上已经安装好了keil5 与ARM包,也下载好了STM32固件库 新建一个工程,添加三个组 加入如下文件 在options 里作如下配置 准备在main.c 中写下第一个实验,点亮一个小灯。 像51单片机一样直接对引脚赋值是行不通的 在…

ChromeOS 132 版本更新

ChromeOS 132 版本更新 1. 企业定制化 Chrome Web Store 管理员现在可以使用新设置定制 Chrome Web Store 以适应他们管理的用户,包括以下功能: 添加公司标志添加首页横幅和自定义公告策划扩展集合实施基于类别的控制 这些设置可以通过管理员控制台进…

绘制决策树的尝试1

代码复制 import pydotplus 复制 - 这一行代码用于导入pydotplus模块,这是一个用来在Python中创建图形的工具。2. python from IPython.display import Image 这一行代码用于从IPython显示模块中导入Image类,它允许我们在Jupyter笔记本中显示图像。…

结构化布线系统分为六个子系统

文章目录 前言系统介绍1. 工作区子系统 (Work Area Subsystem)2. 水平布线子系统 (Horizontal Cabling Subsystem)3. 管理子系统 (Administration Subsystem)4. 干线(垂直)子系统 (Backbone Cabling Subsystem)5. 设备间子系统 (Equipment Room Subsyste…

知识图谱结合大模型用于聊天分析

知识图谱结合大模型在聊天分析中的应用主要体现在以下几个方面: 1. 提升对话理解和生成能力 知识图谱(KG)与大模型(LLM)的结合能够显著增强对话系统的语义理解能力和生成能力。例如,通过知识图谱的结构化…

堆的补充--Top-K问题

我们今天来学习二叉树的链式存储,但是在我们学习之前我们先来看一下我们昨天学习的顺序存储:二叉树; 我们之前说堆有两种方法: 1.向下调整建堆: 我们找到最后一个非叶子结点,把他作为起始下标&#xff1…

放大器版图绘制全流程

版图的构成主要分为四部分。对于一般的电路来说,重点关注前三部分第一部分是电路中所对应的mos管电容电阻这些基本器件,一般都是由工艺产商提供标准的元件版图,这部分是我们不需要太关心的。第二部分是对器件进行连线第三部分是衬底的连接&am…

我谈概率论与数理统计的知识体系

学习概率统计二十多年后,在廖老师的指导下,厘清了各章之间的关系。本来就是一条线两个分支,脉络很清晰。 分支一:从随机现象到样本空间到随机事件再到概率。 从随机事件到随机变量:为了进行定量的数学处理&#xff0…