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的使用&…

进制之间转换

「 一、十进制 二进制 」 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的…

【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 调…

JavaScript学习笔记(3)

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

Hive之加载csv格式数据到hive

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

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. 提升对话理解和生成能力 知识图谱(KG)与大模型(LLM)的结合能够显著增强对话系统的语义理解能力和生成能力。例如,通过知识图谱的结构化…

堆的补充--Top-K问题

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

放大器版图绘制全流程

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

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

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

群晖Cloud Sync如何实现一键同步备份让数据更安全高效

文章目录 前言1. 群晖NAS安装Cloud Sync1.1 安装和配置 Cloud Sync 2. 功能演示3. 群晖安装cpolar内网穿透3.1 配置Cloud Sync公网访问地址 4. 配置固定公网地址 前言 在数字化时代,数据的管理和备份成为了我们日常生活中的一个关键任务。无论是个人还是企业&#…

探索Linux中的进程控制:从启动到退出的背后原理

个人主页:chian-ocean 文章专栏-Linux 前言: 进程控制是操作系统对进程的创建、运行、调度、中止等活动进行管理和协调的行为。它是操作系统中至关重要的一部分,保证多任务处理环境下的资源分配和系统稳定性。 进程创建 fork( ) fork() 调…

密码无关认证:金融机构如何解决密码问题

密码安全问题,依然是金融行业面临的重大挑战。尽管密码简单易用,但许多金融机构仍然依赖这种方式进行身份认证。幸运的是,随着技术的发展,密码无关认证已经成为一种更加安全、便捷的选择,它能够为数字银行带来更好的用…

HarmonyOS基于ArkTS卡片服务

卡片服务 前言 Form Kit(卡片开发框架)提供了一种在桌面、锁屏等系统入口嵌入显示应用信息的开发框架和API,可以将应用内用户关注的重要信息或常用操作抽取到服务卡片(以下简称“卡片”)上,通过将卡片添加…

运算放大器应用电路设计笔记(六)

6.1输出失调电压发生的原因与计算 6.1.1用噪声增益进行评价 若运算放大器两个输入端接地,则理想运放输出为零,但实际的运放输出不为零,有一定的直流输出电压。这种直流电压称为输出失调电压。发生的原因是,运算放大器内部元件尤…

【Vim Masterclass 笔记25】S10L45:Vim 多窗口的常用操作方法及相关注意事项

文章目录 S10L45 Working with Multiple Windows1 水平分割窗口2 在水平分割的新窗口中显示其它文件内容3 垂直分割窗口4 窗口的关闭5 在同一窗口水平拆分出多个窗口6 关闭其余窗口7 让四个文件呈田字形排列8 光标在多窗口中的定位9 调节子窗口的尺寸大小10 变换子窗口的位置11…