当前位置: 首页 > news >正文

黄色风格网站模板/深圳网站建设

黄色风格网站模板,深圳网站建设,四川 网站建设,wordpress显示浏览次数Hi~!这里是奋斗的小羊,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~~ 💥💥个人主页:奋斗的小羊 💥💥所属专栏:C语言 🚀本系列文章为个人学习…

Hi~!这里是奋斗的小羊,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~~
💥💥个人主页:奋斗的小羊
💥💥所属专栏:C语言

🚀本系列文章为个人学习笔记,在这里撰写成文一为巩固知识,二为展示我的学习过程及理解。文笔、排版拙劣,望见谅。


目录

  • 前言
  • 1、为什么要有动态内存分配
  • 2、malloc 和 free
    • 2.1 malloc
    • 2.2 free
  • 3、calloc 和 realloc
    • 3.1 calloc
    • 3.2 realloc
  • 总结

前言

本篇文章将介绍C语言中除指针和结构体外又一重要的内容——动态内存管理
在C语言中,我们更多的需要手动分配和释放内存,这意味着我们必须正确地管理内存,以避免内存泄漏、内存溢出和其他内存错误,这些错误可能导致程序崩溃或安全漏洞。因此,了解内存管理是编写高质量、高效率和健壮性程序的重要部分。


1、为什么要有动态内存分配

目前我们申请内存的方法有两种,创建相关类型变量int n = 0;和创建相关类型数组int arr[10] = { 0 };
但是这样申请的内存是有缺点的:

  • 申请的内存大小是有限的,不能指定大小

  • 数组在声明的时候必须指定长度,数组空间一旦确定下来就不能调整

  • 数组空间在申请前我们不能给出一个准确的大小,大了浪费,小了不够

有时候我们需要的空间大小在程序运行的时候才能知道,那数组的编译时开辟空间的方式就不能满足了
为了解决这个问题,C语言引入了动态内存开辟,让我们可以自己申请和释放内存,这样就比较灵活了
空间不够我们可以增大,空间太大我们可以缩小


2、malloc 和 free

使用动态内存管理函数都需要包含头文件<stdlib.h>

2.1 malloc

C语言提供了一个动态内存开辟的函数malloc

void* malloc(size_t size);

malloc 函数的作用是开辟一块指定大小的、连续的、有限的内存空间,大小由size 决定,是不能开辟无限空间的
在x86环境下开辟一块超大内存空间,若开辟失败打印出失败原因:

#include <stdio.h>
#include <stdlib.h>int main()
{int* p = (int*)malloc(INT_MAX);//INT_MAX=2147483647if (p == NULL){//空间开辟失败perror("malloc");//失败后用return终止程序return 1;}return 0;
}

在这里插入图片描述

对于malloc函数,我们需要注意:

  • 参数的单位是字节
  • 如果size是0,malloc的行为是未定义的,取决于编译器
  • malloc的返回值是void *类型的指针
  • 申请空间成功的话返回起始地址,反之则返回NULL
  • malloc返回的地址我们基本都会直接强转为我们需要的类型的地址

示例:申请10个整形空间,存入1~10

#include <stdio.h>
#include <stdlib.h>int main()
{int* p = (int*)malloc(10 * sizeof(int));if (p == NULL){//空间开辟失败perror("malloc");//失败后用return终止程序return 1;}//可以使用开辟好的空间int i = 0;for (i = 0; i < 10; i++){*(p + i) = i + 1;}return 0;
}

在这里插入图片描述

malloc申请的空间和数组有什么区别?

  • 动态内存的大小可以调整
  • 空间开辟的位置不一样

在这里插入图片描述
我们创建的局部数组就在栈区

虽然空间有区别,但在使用上是一样的


2.2 free

C语言提供了另外一个函数free,专门是用来做动态内存的释放和回收的,mallocfree基本都要成对存在,函数原型如下:

void free(void* ptr);

free函数是用来释放开辟的动态内存的,我们将上面开辟的动态内存释放:

#include <stdio.h>
#include <stdlib.h>int main()
{int* p = (int*)malloc(10 * sizeof(int));if (p == NULL){//空间开辟失败perror("malloc");//失败后用return终止程序return 1;}//可以使用开辟好的空间int i = 0;for (i = 0; i < 10; i++){*(p + i) = i + 1;}//将开辟的动态内存释放free(p);p = NULL;return 0;
}

注意:用free释放动态内存空间后,指针p中还保留着其地址,安全起见我们需要给指针p赋NULL,因此free(p)p = NULL总是一起出现的
既然有free函数,所以说明动态内存是不能自动回收的,所以malloc申请的空间和数组又有了一个区别:

数组在进它的作用域时申请空间,出作用域时自动释放空间;而malloc申请的动态内存空间需要我们手动地释放
如果不释放,程序结束的时候也会被系统自动回收,但是并不建议这样做,自己申请的空间要自己释放,不然会浪费资源,也是不负责任的行为

特别的:

  • 如果参数ptr指向的空间不是动态开辟的,free的行为是未定义的
  • 如果参数ptrNULL指针,则free什么都不做

3、calloc 和 realloc

3.1 calloc

C语言还提供了一个函数calloc,其函数原型是:

void* calloc( size_t num, size_t size );

calloc的作用是开辟num个大小为size的连续空间,同时将内存空间初始化为0

calloc申请10个整型的空间,并打印出内存中的值

#include <stdio.h>
#include <stdlib.h>int main()
{//int* p = (int*)malloc(10 * sizeof(int));int* p = (int*)calloc(10, sizeof(int));if (p == NULL){//空间开辟失败perror("calloc");//失败后用return终止程序return 1;}//可以使用开辟好的空间int i = 0;for (i = 0; i < 10; i++){printf("%d ", p[i]);//*(p + i)}//将开辟的动态内存释放free(p);p = NULL;return 0;
}

在这里插入图片描述

如果将malloc申请的动态内存空间中的值打印出来,应该都是随机值:

在这里插入图片描述

所以malloccalloc只两个区别:

  • malloc有1个参数,而calloc有2个参数
  • calloc会把申请的动态内存空间内的值初始化为全0,而malloc不会

3.2 realloc

在文章开头我们提到了,有时在定义数组的时候我们并不能给定数组一个准确的长度,大了浪费,小了不够。
realloc函数的出现让动态内存管理更加灵活,它的作用是调整动态内存空间的大小,原型如下:

void *realloc( void *ptr, size_t new_size );
  • ptr:指向之前通过malloccallocrealloc开辟的内存块(必须是起始地址)
  • new_size:内存新大小(单位字节)
  • 返回值void *:调整后的内存起始地址,若失败则返回空指针

当我们想用realloc函数将一个动态内存空间调整的小一点,则相应的动态内存空间就会减小到我们想要的大小;而当我们想用realloc函数将一个动态内存空间调整的大一点,这时候就会有两种情况出现:

情况一:原内存后的可用空间足够我们的扩容
在这里插入图片描述

这时候realloc函数就会按正常程序走,返回原内存的起始地址

情况二:原内存后的可用空间不够我们扩容
在这里插入图片描述

这时候realloc函数会在堆区中找一块足以完成我们目的的内存空间,并将原内存中的内容拷贝到新内存空间中,realloc函数还会自己将原内存空间释放,最后返回新开辟的内存空间的起始地址

当然,不管我们是想将原内存空间调小还是扩容,都有失败的可能
所以,realloc函数的返回值我们不能直接用指向原内存的指针接收,因为如果realloc返回的是NULL,则原内存的地址都会消失
我们可以用一个新指针过渡

#include <stdio.h>
#include <stdlib.h>int main()
{//int* p = (int*)malloc(10 * sizeof(int));int* p = (int*)calloc(10, sizeof(int));if (p == NULL){//空间开辟失败perror("calloc");//失败后用return终止程序return 1;}//可以使用开辟好的空间int i = 0;for (i = 0; i < 10; i++){printf("%d ", p[i]);//*(p + i)}//调整空间,扩容到20个整型空间int* ptr = (int*)realloc(p, 20 * sizeof(int));//用新指针过渡if (ptr != NULL){p = ptr;}//使用// ...//将开辟的动态内存释放free(p);p = NULL;return 0;
}

总结

  • 动态内存管理通过使用malloccallocrealloc等函数来分配内存,使用free函数来释放已经分配的内存。
  • 动态内存管理能够优化程序的内存利用率,避免内存泄漏和内存溢出等问题,在C语言中,动态内存管理是我们必须掌握的重要技能之一

相关文章:

C语言详解(动态内存管理)1

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f4a5;&#x1f4a5;个人主页&#xff1a;奋斗的小羊 &#x1f4a5;&#x1f4a5;所属专栏&#xff1a;C语言 &#x1f680;本系列文章为个人学习…...

106.网络游戏逆向分析与漏洞攻防-装备系统数据分析-在UI中显示装备与技能信息

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 如果看不懂、不知道现在做的什么&#xff0c;那就跟着做完看效果&#xff0c;代码看不懂是正常的&#xff0c;只要会抄就行&#xff0c;抄着抄着就能懂了 内容…...

AWS EMR Serverless

AWS概述 EMR Serverless 简介 在AWS概述一文中简单介绍过AWS EMR, 它是AWS提供的云端大数据平台。借助EMR可以设置集群以便在几分钟内使用大数据框架处理和分析数据。创建集群可参考官方文档&#xff1a;Amazon EMR 入门。但集群创建之后需要一直运行&#xff0c;用户需要管理…...

Java面试题:Redis持久化问题

Redis持久化问题 RDB (Redis Database Backup File) Redis数据快照 将内存中的所有数据都记录到磁盘中做快照 当Redis实例故障重启时,从磁盘读取快照文件恢复数据 使用 save/bgsave命令进行手动快照 save使用主进程执行RDB,对所有命令都进行阻塞 bgsave使用子进程执行R…...

【Java】解决Java报错:ClassCastException

文章目录 引言1. 错误详解2. 常见的出错场景2.1 错误的类型转换2.2 泛型集合中的类型转换2.3 自定义类和接口转换 3. 解决方案3.1 使用 instanceof 检查类型3.2 使用泛型3.3 避免不必要的类型转换 4. 预防措施4.1 使用泛型和注解4.2 编写防御性代码4.3 使用注解和检查工具 5. 示…...

OpenCV-最小外接圆cv::minEnclosingCircle

作者&#xff1a;翟天保Steven 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 函数原型 void minEnclosingCircle(InputArray points, Point2f& center, float& radius); 参数说明 InputArray类型的…...

大小堆运用巧解数据流的中位数

​​​​​​​​​​ 一、思路 我们将所有数据平分成两份&#xff0c;前面那一部分用小堆来存&#xff0c;后面的部分用大堆来存&#xff0c;这样我们就能立刻拿到中间位置的值。 如果是奇数个数字&#xff0c;那么我们就将把中间值放在前面的大堆里&#xff0c;所以会有两种…...

AI能力边界不断扩展,将对国家安全产生深远影响

文 | 中国信息安全测评中心 王欣 随着 ChatGPT 的发布及相关应用的落地&#xff0c;人工智能技术给全球各个行业带来了一波又一波冲击。GPT-4 多模态大型语言模型更是将人工智能的能力提升到新的高度&#xff0c;无论从技术先进性还是应用实践能力来看&#xff0c;此模型均可被…...

【UnityShader入门精要学习笔记】第十六章 Unity中的渲染优化技术 (上)

本系列为作者学习UnityShader入门精要而作的笔记&#xff0c;内容将包括&#xff1a; 书本中句子照抄 个人批注项目源码一堆新手会犯的错误潜在的太监断更&#xff0c;有始无终 我的GitHub仓库 总之适用于同样开始学习Shader的同学们进行有取舍的参考。 文章目录 移动平台上…...

GPT-4o:免费且更快的模型

OpenAI GPT-4o 公告 OpenAI 推出了增强版 GPT-4 模型——OpenAI GPT-4o&#xff0c;用于支持 ChatGPT。首席技术官 Mira Murati 表示&#xff0c;更新后的模型速度更快&#xff0c;并在文本、视觉和音频处理方面有了显著提升。GPT-4o 将免费向所有用户开放&#xff0c;付费用户…...

docker部署fastdfs

我的镜像包地址 链接&#xff1a;https://pan.baidu.com/s/1j5E5O1xdyQVfJhsOevXvYg?pwdhcav 提取码&#xff1a;hcav docker load -i gofast.tar.gz拉取gofast docker pull sjqzhang/go-fastdfs启动gofast docker run -d --name fastdfs -p 8080:8080 -v /opt/lijia/lijia…...

【劲舞团game】

编写《劲舞团》这样的游戏代码是一个复杂的过程&#xff0c;涉及到游戏引擎的使用、图形渲染、物理模拟、音频处理、网络通信等多个方面。以下是一个非常简化的步骤&#xff0c;用于说明如何开始编写一个基于Unity引擎的简单舞蹈游戏&#xff1a; 1. 准备开发环境 下载并安装…...

Day15—图像爬虫与简单处理

图像爬虫是一种专门用于从互联网上下载图像的网络爬虫。除了文本内容,图像也是网站中的重要组成部分,它们可以用于多种目的,如图像识别、内容分析、数据备份等。 环境准备 首先,确保你的环境中已安装Python和必要的库。如果没有安装Pillow库,可以通过以下命令安装:pip in…...

Rust基础学习-Rust中的文件操作

文件结构 在Rust中&#xff0c;std::fs::File 结构体代表一个文件。它允许我们对文件执行读/写操作。文件 I/O 是通过提供与文件系统交互的功能的 std::fs 模块执行的。 File 结构体中的所有方法都返回std::io::Result的变体&#xff0c;或者简单地是 Result 枚举。这里会涉及…...

Activator.CreateInstance 与 Type.InvokeMember的区别

文章目录 一、使用 Activator.CreateInstance 创建实例1、使用 Activator.CreateInstance 的优点和缺点2、使用 Activator.CreateInstance 的代码示例 二、使用 Type.InvokeMember 创建实例1、使用 Type.InvokeMember 的优点和缺点2、使用 Type.InvokeMember 的代码示例 三、Ac…...

Java18+​App端采用uniapp+开发工具 idea hbuilder智能上门家政系统源码,一站式家政服务平台开发家政服务

Java18​App端采用uniapp开发工具 idea hbuilder智能上门家政系统源码&#xff0c;一站式家政服务平台开发 家政服务 家政服务是一个专为家政服务人员设计的平台&#xff0c;该平台旨在提供便捷、高效的工作机会&#xff0c;同时确保服务质量和客户体验。 以下是关于家政服务师…...

【MySQL】探索 MySQL 的 GROUP_CONCAT 函数

缘分让我们相遇乱世以外 命运却要我们危难中相爱 也许未来遥远在光年之外 我愿守候未知里为你等待 我没想到为了你我能疯狂到 山崩海啸没有你根本不想逃 我的大脑为了你已经疯狂到 脉搏心跳没有你根本不重要 &#x1f3b5; 邓紫棋《光年之外》 什么是 GRO…...

SpringBoot整合RabbitMQ (持续更新中)

RabbitMQ 官网地址&#xff1a;RabbitMQ: One broker to queue them all | RabbitMQ RabbitMQ 与 Erlang 版本兼容关系​ 3.13.0 26.0 26.2.x The 3.13 release series is compatible with Erlang 26. OpenSSL 3 support in Erlang is considered to be mature and ready for…...

瑞鑫RK3588 画中画 OSD 效果展示

这些功能本来在1126平台都实现过 但是迁移到3588平台之后 发现 API接口变化较大 主要开始的时候会比较费时间 需要找到变动接口对应的新接口 之后 就比较好操作了 经过几天的操作 已实现 效果如下...

【全开源】防伪溯源一体化管理系统源码(FastAdmin+ThinkPHP+Uniapp)

&#x1f50d;防伪溯源一体化管理系统&#xff1a;守护品质&#xff0c;追溯无忧 一款基于FastAdminThinkPHP和Uniapp进行开发的多平台&#xff08;微信小程序、H5网页&#xff09;溯源、防伪、管理一体化独立系统&#xff0c;拥有强大的防伪码和溯源码双码生成功能&#xff0…...

自然语言处理:第三十三章FILCO:过滤内容的RAG

文章链接: [2311.08377] Learning to Filter Context for Retrieval-Augmented Generation (arxiv.org) 项目地址: zorazrw/filco: [Preprint] Learning to Filter Context for Retrieval-Augmented Generaton (github.com) 在人工智能领域&#xff0c;尤其是在开放域问答和事…...

js:flex弹性布局

目录 代码&#xff1a; 1、 flex-direction 2、flex-wrap 3、justify-content 4、align-items 5、align-content 代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewp…...

Pytorch常用函数用法归纳:创建tensor张量

1.torch.arange() (1)函数原型 torch.arange(start,end,step,*,out,dtype,layout,device,requires_grad) (2)参数说明: 参数名称参数类型参数说明startNumber起始值&#xff0c;默认值为0endNumber结束值&#xff0c;取不到&#xff0c;为开区间stepNumber步长值&#xff0…...

WPF前端:一个纯Xaml的水平导航栏

效果图&#xff1a; 代码&#xff1a; 1、样式代码&#xff0c;可以写在窗体资源处或者样式资源文件中 <Style x:Key"MenuRadioButtonStyle" TargetType"{x:Type RadioButton}"><Setter Property"FontSize" Value"16" />…...

谷粒商城实战(033 业务-秒杀功能4-高并发问题解决方案sentinel 1)

Java项目《谷粒商城》架构师级Java项目实战&#xff0c;对标阿里P6-P7&#xff0c;全网最强 总时长 104:45:00 共408P 此文章包含第326p-第p331的内容 关注的问题 sentinel&#xff08;哨兵&#xff09; sentinel来实现熔断、降级、限流等操作 腾讯开源的tendis&#xff0c…...

STM32项目分享:智能家居(机智云)系统

目录 一、前言 二、项目简介 1.功能详解 2.主要器件 三、原理图设计 四、PCB硬件设计 1.PCB图 2.PCB板及元器件图 五、程序设计 六、实验效果 七、资料内容 项目分享 一、前言 项目成品图片&#xff1a; 哔哩哔哩视频链接&#xff1a; https://www.bilibili.c…...

游戏盾之应用加速,何为应用加速

在数字化时代&#xff0c;用户对于应用程序的防护要求以及速度和性能要求越来越高。为了满足用户的期望并提高业务效率&#xff0c;应用加速成为了不可忽视的关键。 应用加速是新一代的智能分布式云接入系统&#xff0c;采用创新级SD-WAN跨域技术&#xff0c;针对高防机房痛点进…...

Java 基础面试题

文章目录 重载与重写抽象类与接口面向对象a a b 与 a b 的区别final、finalize、finallyString、StringBuild、StringBuffer位运算反射 重载与重写 重载&#xff1a;是在同一个类中&#xff0c;方法名相同&#xff0c;方法参数类型&#xff0c;个数不同&#xff0c;返回类型…...

Nginx 1.26.0 爆 HTTP/3 QUIC 漏洞,建议升级更新到 1.27.0

据悉&#xff0c;Nginx 1.25.0-1.26.0 主线版本中涉及四个与 NGINX HTTP/3 QUIC 模块相关的中级数据面 CVE 漏洞&#xff0c;其中三个为 DoS 攻击类型风险&#xff0c;一个为随机信息泄漏风险&#xff0c;影响皆为允许未经身份认证的用户通过构造请求实施攻击。目前已经紧急发布…...

uniadmin引入iconfont报错

当在uniadmin中引入iconfont后&#xff0c;出现错误&#xff1a; [plugin:vite:css] [postcss] Cannot find module ‘E:/UniAdmin/uniAdmin/static/fonts/iconfont.woff2?t1673083050786’ from ‘E:\UniAdmin\uniAdmin\static\fonts\iconfont.css’ 这是需要更改为绝对路径…...