C动态内存那些事

为什么存在动态内存分配?

首先,动态内存分配是计算机中一种重要的内存管理方法,它主要解决了静态内存分配无法灵活应对变化需求的问题。以下是几个存在动态内存分配的原因:

  1. 灵活性:动态内存分配允许程序在运行时根据需要动态地分配和释放内存。这对于需要动态改变内存使用情况的应用来说非常重要,比如动态数据结构、动态数组或者不确定大小的数据等。

  2. 节省内存:动态内存分配可以根据需求精确地分配所需大小的内存,避免了静态分配过多内存的浪费,并且可以回收不再使用的内存,提高内存的利用率。

  3. 动态数据结构支持:一些常见的数据结构,比如链表、树等,需要根据运行时的需求动态地分配内存来存储数据。动态内存分配可以满足这些数据结构的需要,使得程序能够更灵活地处理各种数据。

  4. 多任务支持:操作系统中的多任务环境下,每个任务需要独立的内存空间来存储自己的数据。动态内存分配允许每个任务根据需要独立分配内存,从而实现任务间的数据隔离,提高系统的安全性和可靠性。

其次值得注意的是,动态内存分配也需要注意管理好分配和释放内存的过程,避免内存泄漏或者其他内存管理问题。

动态内存管理函数

void* malloc(size_t size)

成功返回:开辟好空间的首地址,不会初始化空间内容,当程序退出时,还给操作系统,,当程序不退出,动态申请的内存,不会主动释放的

错误返回:NULL指针------NULL指针不可以使用,所以要对malloc返回的指针做检查

向内存申请一块连续可以的空间,并返回指向这块空间的指针

void* calloc(size_t num, size_t size);
  • num:要分配的元素个数。
  • size:每个元素的大小。
  • calloc函数会分配num * size字节的内存空间,并将所分配的内存块中的每个字节都初始化为0。这与使用malloc分配内存后手动初始化为0的效果相同。
void* realloc(void *ptr, size_t size);
  • ptr:指向之前分配的内存块的指针。(简单来说就是提前申请过的一块内存空间首地址)
  • size:要重新分配的内存块的大小。
  • realloc函数可以用来扩大或缩小已分配内存的大小。当ptr为NULL时,realloc的行为与malloc相同,即分配一块新的内存空间。当ptr不为NULL时,realloc会尝试重新分配ptr指向的内存块,将其大小调整为size所指定的大小。
  • (1)当新的大小size小于或等于原内存块的大小时,realloc会尝试缩小内存块的大小,并返回指向缩小后内存的指针。可能会丢失部分原有数据。
  • (2)当新的大小size大于原内存块的大小时,realloc会尝试扩大内存块的大小。如果扩大成功,会返回指向扩大后内存的指针。扩大后的新增内存区域的内容是未定义的。如果扩大失败,会保持原有内存块不变,并返回NULL。

  • (3)当ptr为NULL时,realloc会等同于malloc(size),即分配一块新的大小为size的内存块,并返回指向该内存块的指针。

由于这个函数很特别,下面通过一段代码结合画的内存图,方便大家理解

int main()

{

        int* p=(int*)malloc(40);

        if(p==NULL)

        {

                perror("malloc");

                return 1;

        }

        int i=0;

        for(i=0;i<10;i++)

        {

                p[i]=i+1;

        }        

        p=realloc(p,80);

        return 0;

}

下面是申请成功的情况,红色区域代码后边有占用的数据

第二种情况步骤

1.开辟新空间

2.将旧空间数据拷贝到新空间

3.释放旧空间

4.返回新空间起始地址

还有一种是内存申请失败的情况会造成内存泄漏

为了避免内存泄漏可以把

p=realloc(p,80);这段代码替换成

int* ptr=(int*)realloc(p,80);

if(ptr!=NULL)

{

        p=ptr;

        ptr=NULL;

}

else

{

        perror("realloc");

        return 1;

}

//释放

free(p);

void* free(void* ptr)

释放掉ptr所指的内存空间

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

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

相关文章

《WebKit 技术内幕》学习之十(4): 插件与JavaScript扩展

4 Chromium扩展机制 4.1 原理 Chromium的扩展&#xff08;Extension&#xff09;机制 (1) 原先是Chromium推出的一项技术&#xff0c;该机制能够扩展浏览器的能力&#xff0c;例如笔者使用的一个扩展实例名为“switchy proxy”&#xff0c;它可以帮助用户方便的切换Chromium…

Leetcode—29. 两数相除【中等】

2023每日刷题&#xff08;九十四&#xff09; Leetcode—29. 两数相除 叛逆期实现代码 class Solution { public:int divide(int dividend, int divisor) {if(dividend INT_MIN && divisor -1) {return INT_MAX;} return dividend / divisor;} };运行结果 倍增算法…

EG-2121CA (晶体振荡器 低抖动表面声波(SAW)振荡器)

在当今高度数字化的时代&#xff0c;稳定的信号传输显得尤为重要。若要实现信号的稳定传输&#xff0c;晶体振荡器必不可少。EG-2121CA&#xff0c;它是一款低抖动表面声波&#xff08;SAW&#xff09;振荡器设计的产品&#xff0c;凭借其出色的频率范围、稳定的电源电压和可靠…

JAVA泛型、泛型通配符、综合练习

作用&#xff1a; 是 jdk5 中引入的特性&#xff0c;可以在编译阶段 约束 操作的数据类型&#xff0c;并进行检查。 格式&#xff1a; <数据类型> 注意泛型只能支持引用数据类型&#xff0c;基本数据类型可转成对应的包装类。 问题&#xff1a; 在没有泛型的时候&…

「JavaSE」抽象类接口3

&#x1f387;个人主页&#xff1a;Ice_Sugar_7 &#x1f387;所属专栏&#xff1a;快来卷Java啦 &#x1f387;欢迎点赞收藏加关注哦&#xff01; 抽象类&接口3 &#x1f349;Clonable 接口和深拷贝&#x1f34c;浅拷贝和深拷贝 &#x1f349;Object类&#x1f349;抽象类…

无法获得dpkg前端锁、Linux之E: 无法锁定管理目录(/var/lib/dpkg/),是否有其他进程正占用它?(解决方法)

无法获得dpkg前端锁的解决方法 sudo rm /var/lib/dpkg/lock sudo rm /var/lib/dpkg/lock-frontend sudo rm /var/cache/apt/archives/lock 输入以上三个命令即可解除占用。解除后&#xff0c;继续运行apt命令&#xff0c;已经顺利运行了。解除前端锁后&#xff0c;Linux之E: 无…

.net访问oracle数据库性能问题

问题&#xff1a; 生产环境相同的inser语句在别的非.NET程序相应明显快于.NET程序&#xff0c;执行时间相差比较大&#xff0c;影响正常业务运行&#xff0c;测试环境反而正常。 问题详细诊断过程 问题初步判断诊断过程&#xff1a; 查询插入慢的sql_id 检查对应的执行计划…

20240122面试练习题10

1. Redis为什么执行这么快&#xff1f; 二、Redis为什么这么快&#xff1f; 1、完全基于内存&#xff0c;数据存在内存中&#xff0c;绝大部分请求是纯粹的内存操作&#xff0c;非常快速&#xff0c;跟传统的磁盘文件数据存储相比&#xff0c;避免了通过磁盘IO读取到内存这部分…

配置接口策略路由案例

知识改变命运&#xff0c;技术就是要分享&#xff0c;有问题随时联系&#xff0c;免费答疑&#xff0c;欢迎联系 厦门微思网络​​​​​​ https://www.xmws.cn 华为认证\华为HCIA-Datacom\华为HCIP-Datacom\华为HCIE-Datacom Linux\RHCE\RHCE 9.0\RHCA\ Oracle OCP\CKA\K8S\…

如何使用Jellyfin+cpolar搭建私人影音平台实现无公网ip远程访问

文章目录 1. 前言2. Jellyfin服务网站搭建2.1. Jellyfin下载和安装2.2. Jellyfin网页测试 3.本地网页发布3.1 cpolar的安装和注册3.2 Cpolar云端设置3.3 Cpolar本地设置 4.公网访问测试5. 结语 1. 前言 随着移动智能设备的普及&#xff0c;各种各样的使用需求也被开发出来&…

jQuery实现选择方法和保护信息方法

最近呢&#xff01;一直在学习jQuery语法&#xff0c;也没时间发布文章&#xff0c;现在学的差不多了&#xff0c;先跟大家分享下学习感受吧&#xff01;JavaScript学过后&#xff0c;再学习jQuery语法&#xff0c;应该是简单的&#xff0c;但我总是容易把它们搞混&#xff0c;…

Alzet渗透泵工作原理,你清楚么?

由于Alzet渗透泵独特的释放原理&#xff0c;使得许多化学试剂、药剂或者其他物质&#xff0c;可以通过Alzet渗透泵应用到科研试验中。一个小小的胶囊就可以完成持续的动物给药实验&#xff0c;对于科研实验者来说就是一个福音。 那你了解Alzet渗透泵么?让我们一起来简单了解一…

Android HIDL概述与绑定模式的实现

一、前言 Android O(8.0) 版本之后&#xff0c;底层实现有了比较大的变化&#xff0c;最显著的一个方面就是 HIDL 机制的全面实施。本文对于理解系统源码中 Gnss、Usb、Camera 等模块的工作原理有极大帮助。 二、HIDL 设计目的 在 Android O(8.0) 之前系统的升级牵扯多方协作…

循环购:电商新时代的消费革命

随着电商市场的竞争加剧&#xff0c;消费者需求日益多样化&#xff0c;电商企业需要不断创新以满足市场需求。循环购模式作为一种新兴的消费模式&#xff0c;正逐渐受到消费者的青睐&#xff0c;成为电商行业的新热点。本文将深入剖析循环购模式的魅力&#xff0c;探索其在电商…

chromedriver下载地址与安装方法

用到例如selenium时&#xff0c;需要使用谷歌浏览器并配合chromedriver进行模拟浏览等 分享chromedriver的实时更新的下载网址&#xff1a; https://registry.npmmirror.com/binary.html?pathchromedriver/ 。。。 需要找到自己电脑谷歌浏览器版本所对应的chromedriver版本 …

CQ 社区版 2.8.0 | 支持TiDB、StarRocks,新增列过滤算法、导出模式设置等

Hello&#xff0c;CloudQuery 社区版 2.8.0 已发布&#xff0c;本文将带大家详细解析本次更新的功能~&#xff08;完整的讲解视频可点击 &#x1f449;&#x1f3fb; CloudQuery 社区版2.8.0 功能讲解演示 本期亮点更新 新增支持数据源 TiDB、StarRocks数据保护新增列过滤脱敏…

HNSW算法

From&#xff1a; HNSW算法(nsmlib/hnswlib)-CSDN博客HNSW算法的基本原理及使用 - 知乎 HNSW是一种广泛使用的ANN图索引结构&#xff0c;包括DiskANN、DF-GAS、SmartSSD等。本文档主要总结HNSW的结构与工作流程&#xff0c;便于后期研究其工作流程在迁移到CSD中存在的I/O问题…

计算CNN卷积层和全连接层的参数量

计算CNN卷积层和全连接层的参数量 先前阅读 CNN ExplainerA Comprehensive Guide to Convolutional Neural Networks — the ELI5 way 本文主旨意在搞明白2个问题&#xff1a; 第一个问题 一个卷积操作&#xff0c;他的参数&#xff0c;也就是我们要训练的参数&#xff0c;也…

50. Pow(x, n)

分治算法&#xff1a; 从右往左开始递归计算&#xff0c;假设yx^(n/2)&#xff0c;那么当n为偶数时&#xff0c;x^ny*y&#xff0c;当n为奇数时&#xff0c;x^ny*y*x。 另外&#xff0c;注意n有可能是负数。 class Solution {public double myPow(double x, int n) {int N n…

Kettle-Docker部署+Sqlserver数据同步Mysql+Start定时任务

一. 背景介绍 1. ETL是什么 ETL&#xff08;Extract-Transform-Load&#xff09;&#xff0c;即数据抽取、转换、装载的过程。它是一种思想&#xff0c;主要是说&#xff0c;从不同的数据源获取数据&#xff0c;并通过对数据进行处理&#xff08;格式&#xff0c;协议等转换&a…