C语言_动态内存管理

文章目录

  • 一.为什么存在动态内存分配
  • 二.动态内存函数的介绍
    • 2.1 malloc 和 free
    • 2.2 calloc
      • 原型如下
    • 2.3 realloc
      • 函数模型如下
  • 三.常见的动态内存错误
    • 3.1 对NULL的解引用操作
    • 3.2对动态开辟空间的越界访问
    • 3.3非动态开辟内存使用free释放
    • 3.4使用free释放一块动态开辟内存的一部分
    • 3.5 对同一块动态内存多次释放
    • 3.6动态开辟内存忘记释放(内存泄漏)
  • 四.C/C++中程序的内存区域划分
  • 五.柔性数组
    • 5.1 柔性数组特点

一.为什么存在动态内存分配

但,上述的开辟空间有两个特点:
(1)空间开辟大小是固定的。
(2)数组在申明的时候,必须指定数组的长度,他所需要的内存在编译时分配。


二.动态内存函数的介绍

2.1 malloc 和 free

C语言提供一动态内存开辟函数:

void*malloc(size_t size);

这个函数向内存申请一块连续可用的空间,并返回指向这块空间的指针。

  • 如果开辟成功,则返回一个指向开辟好空间的指针。
  • 如果开辟失败,则返回一个NULL指针,因此malloc的返回值一定要做检查。
  • 返回值的类型是void*,所以malloc函数并不知道开辟空间的类型,具体在使用的时候使用者自己来决定。
  • 如果参数size为0,malloc的行为是标准是未定义的,取决于编译器。

malloc 申请的内存空间,当程序退出时,还给操作系统。
当程序不退出,动态申请的内存,不会主动释放的。
需要使用 free 函数来释放。


2.2 calloc

c语言还提供了一个函数叫 calloc ,calloc函数也用来动态内存分配。

原型如下

  • 函数的功能是为num个大小为size的元素开辟一块空间,并且把空间的每个字节初始化为0。
  • 与函数 malloc 的区别只在于calloc 会在返回地址之前把申请的空间的每个字节初始化为全0。

2.3 realloc

  • realloc 函数的出现让动态内存管理更加灵活。
  • 有时我们会发现过去申请的空间太小了,有时又会觉得申请的空间过大了。
  • 那为了合理的使用内存,我们一定会对内存的大小做灵活的调整。那 realloc 函数就可以做到对动态开辟内存大小的调整。

函数模型如下

  • ptr 是要调整的内存地址。
  • size 调整之后新大小
  • 返回值为调整之后的内存起始位置
  • 这个函数调整原内空间大小的基础上,还会将原来内存中的数据移动到新的空间。
  • realloc 在调整内存空间的是存在两种情况:

情况1:原有空间之后有足够大的空间。
情况2:原有空间之后没有足够大的空间。


三.常见的动态内存错误

3.1 对NULL的解引用操作


3.2对动态开辟空间的越界访问


3.3非动态开辟内存使用free释放


3.4使用free释放一块动态开辟内存的一部分


3.5 对同一块动态内存多次释放


3.6动态开辟内存忘记释放(内存泄漏)

忘记释放不再使用的动态开辟的空间会造成内存泄漏。
切记:动态开辟的空间一定要释放,并且正确释放。

动态申请的内存空间 不会因为出了作用域自动销毁(还给操作系统)!! 只有2种方式销毁: 1.free 2. 程序结束(退出)

四.C/C++中程序的内存区域划分

栈区(stack): 在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中, 效率很高,但是分配的内存容量有限。栈区主要存放运行函数而分配的局部变量,函数参数,返回数据,返回地址等。 堆区(heap): 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。分配方式类似于链表。 数据段(静态区)(static): 存放全局变量。静态数据。程序结束后由系统释放。 代码段: 存放函数体 (类成员函数和全局函数)的二进制代码。

实际上普通的局部变量实在栈区分配空间的,栈区的特点是在上面创建的变量出了作用域就销毁。
但被static修饰的变量存放在数据段(静态区),数据段的特点是在上面创建的变量,直到程序结束才销毁。
所以生命周期变长。

五.柔性数组

柔性数组前面至少得有一个其它成员

5.1 柔性数组特点

  • 结构中的柔性数组成员前面必须至少一个其他成员。
  • sizeof 返回的这种结构大小不包括柔性数组的内存。
  • 包含柔性数组成员的结构用malloc() 函数进行内存的动态分配,并且分配的内存应该大于结构的大小,以适应柔性数组的预期大小。

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

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

相关文章

如何提高项目团队资源利用率?5大注意事项

项目团队的资源是有限的,这包括人力、时间、资金、设备等。如果这些资源利用率低下或者浪费,这直接会导致项目成本的增加,不利于产品在竞争激烈的商业环境中保持优势。 因此我们需要提高团队资源利用率,降低项目成本,避…

windows11本地安装部署langchain-chatchat api接口报错

Langchain-chatchat 提示:Langchain服务已经正常启动,swagger-ui页面也正常访问的情况下出现接口调试报错问题 文章目录 Langchain-chatchat前言问题分析解决问题方案 前言 报错接口如下: 2023-11-03 15:23:50 | INFO | stdout | INFO: …

SpringBoot整合JUnit

1.创建新项目 说明:创建springboot_04_junit项目,选择对应的版本。 2.接口类 说明:新建BookDao接口。 package com.forever.dao;public interface BookDao {public void save(); }3.实现类 说明: 新建BookDaoImpl实现类。 pa…

HiveSQL中last_value函数的应用

一、背景 在以下数据中如何实现对每一个列按照更新时间取最新的非null值? 1 a a null 202301 202301 1 b b null null 202302 1 null c null null 202303 1 d null null null 202304如何实现…

【教3妹学编程-算法题】使数组变美的最小增量运算数

2哥 : 3妹,脸上的豆豆好了没呢。 3妹:好啦,现在已经没啦 2哥 : 跟你说很快就会消下去的,还不信~ 既然你的容颜和心情都如此美丽,那我们就再做一道关于美丽的题吧。 3妹:切,2哥就会取笑我&#x…

AD9371 官方例程裸机SW 和 HDL配置概述(三)

AD9371 系列快速入口 AD9371ZCU102 移植到 ZCU106 : AD9371 官方例程构建及单音信号收发 ad9371_tx_jesd -->util_ad9371_xcvr接口映射: AD9371 官方例程之 tx_jesd 与 xcvr接口映射 AD9371 官方例程 时钟间的关系与生成 : AD9371 官方…

【GitHub】Watch、Star、Fork、Follow 有什么区别?

目录 一、前言二、区别1. Watch2. Star3. Fork4. Follow 一、前言 GitHub 是最受欢迎的代码托管平台之一,拥有大量的开源代码可供学习。 Github 中也有类似 “点赞”、“收藏”、“加关注” 的功能。 下面介绍下,GitHub 中 Watch、Star、Fork、Follow 有…

野火霸天虎 STM32F407 学习笔记_1 stm32介绍;调试方法介绍

STM32入门——基于野火 F407 霸天虎课程学习 前言 博主开始探索嵌入式以来,其实很早就开始玩 stm32 了。但是学了一段时间之后总是感觉还是很没有头绪,不知道在学什么。前前后后分别尝试了江协科技、正点原子、野火霸天虎三次 stm32 的课程学习。江协科…

【C++】:类和对象(中):const成员 || 取地址及const取地址操作符重载

📪1.const成员 📪将const修饰的“成员函数”称之为const成员函数,const修饰类成员函数,实际修饰该成员函数隐含的this指针,表明在该成员函数中不能对类的任何成员进行修改 🎈首先我们来想一想为什么在C中…

layui form表单 调整 label 宽度

这个可以调整所有label .layui-form-label {width: 120px !important; } .layui-input-block {margin-left: 150px !important; }情况是这样的&#xff0c;表单里有多个输入框&#xff0c;只有个别label 是长的&#xff0c;我就想调整一下个别长的&#xff0c;其它不变 <di…

非关系型数据库Redis的安装【Linux】及常用命令

前言 Redis&#xff08;Remote Dictionary Server&#xff09;是一种开源的内存数据库管理系统&#xff0c;它以键值存储方式来存储数据&#xff0c;并且支持多种数据结构&#xff0c;如字符串、哈希、列表、集合、有序集合等。Redis最初由Salvatore Sanfilippo开发&#xff0c…

华为升腾C92安装windows NAS

华为升腾C92安装windows NAS NAS&#xff08;Network Attached Storage&#xff1a;网络附属存储&#xff09;&#xff0c;我们之前所了解的群晖&#xff0c;也仅仅是NAS当中的一个品牌运营而已。 这次&#xff0c;我决定在C92上面试着安装Windows NAS。虽然群晖NAS是基于Linu…

sitespeedio.io 前端页面监控安装部署接入influxdb 到grafana

1.docker部署influxdb,部署1.8一下&#xff0c;不然语法有变化后面用不了grafana模板 docker run -d -p 8086:8086 --name influxdb -v $PWD/influxdb-data:/var/lib/influxdb influxdb:1.7.11-alpine docker exec -it influxdb_id bash #influx create user admin with pass…

【计算机网络】运输层

概述运输层服务 运输层协议为运行在不同主机上的应用程序提供了逻辑通信功能。 运输层协议是在端系统中而不是在路由器中实现的。 运输层和网络层的关系&#xff1a; 网络层提供主机之间的逻辑通信&#xff0c;而运输层为**运行在不同主机上的应用程序&#xff08;进程&#…

「视频编码软件」Media Encoder(Me) 2024 Mac/win中文版下载安装

Adobe Media Encoder(Me) 2024是一款专业的视频编码工具&#xff0c;它可以将各种视频格式进行转换、压缩和编码&#xff0c;以满足不同媒体平台和设备的需求。 以下是 Media Encoder 2023 的主要功能和新增功能&#xff1a; 视频编码和转换&#xff1a;支持将各种视频格式进…

Pytorch网络模型训练

现有网络模型的使用与修改 vgg16_false torchvision.models.vgg16(pretrainedFalse) # 加载一个未预训练的模型 vgg16_true torchvision.models.vgg16(pretrainedTrue) # 把数据分为了1000个类别print(vgg16_true) 以下是vgg16预训练模型的输出 VGG((features): S…

2023全新小程序广告流量主奖励发放系统源码 流量变现系统 带安装教程

2023全新小程序广告流量主奖励发放系统源码 流量变现系统 分享软件&#xff0c;吃瓜视频&#xff0c;或其他资源内容&#xff0c;通过用户付费买会员来变现&#xff0c;用户需要付费&#xff0c;有些人喜欢白嫖&#xff0c;所以会流失一部分用户&#xff0c;所以就写了这个系统…

CSGO饰品价格暴跌的原因分析

CSGO饰品暴跌3个月&#xff0c;盘点6大原因 今天我们来聊一下CSGO饰品市场的情况。大部分装备从3月份开始就一直持续走低&#xff0c;到现在已经是7月份了&#xff0c;还有部分饰品呈阴跌趋势。整个市场沉寂一片&#xff0c;还有些悲观主义者天天在吆喝&#xff1a;市场崩盘了&…

【论文阅读笔记】GLM-130B: AN OPEN BILINGUAL PRE-TRAINEDMODEL

Glm-130b:开放式双语预训练模型 摘要 我们介绍了GLM-130B&#xff0c;一个具有1300亿个参数的双语(英语和汉语)预训练语言模型。这是一个至少与GPT-3(达芬奇)一样好的100b规模模型的开源尝试&#xff0c;并揭示了如何成功地对这种规模的模型进行预训练。在这一过程中&#xff0…

香港金融科技周2023:AIGC重塑金融形态

10月31日&#xff0c;由香港财经事务及库务局与投资推广署主办的“香港金融科技周2023大湾区专场”盛大启幕。中国AI决策领先企业萨摩耶云科技集团创始人、董事长兼 CEO林建明受邀参加圆桌会议&#xff0c;与中国内地、香港以及全球金融科技行业顶尖人才、创新企业、监管机构和…