C语言-动态内存管理
1.为什么要有动态内存分配
我们现如今已经掌握的内存开辟方式有
int main()
{int a = 0;int arr[30] = { 0 };return 0;
}
这两种方式,但是这种开辟空间的方式有两个特点:
1.空间开辟大小是固定的
2.数组在申明的时候,必须指定数组的长度,数组空间一旦确定了大小就不可更改了
但是对于空间的需求,不仅仅是上述的情况。有时候我们需要的空间大小在程序运行的时候才能知道,这样的话数组编译时开辟的空间可能就会不够用
于是C语言就引入了动态内存开辟,让我们自己可以申请和释放空间,提高了空间利用的灵活性
2.malloc和free
2.1malloc
C语言提供了一个动态内存开辟的函数
头文件是stdble
void* malloc(size_t size);
-malloc函数向内存申请一块连续可用的空间,并返回指向这块空间的指针。
-如果开辟成功,则返回一个指向开辟好的内存的指针
-如果开辟失败,则返回一个空指针(NULL)
-返回值的类型是void*,所以malloc函数并不知道开辟空间的类型,需要我们根据需要进行转换
-如果参数size为0,malloc的行为是标准是未定义的,取决于编译器
#include<stdlib.h>
int main()
{int * p = (int *)malloc(10 * sizeof(int));int i = 0;for (i = 0; i < 10; i++){*(p + i) = i;printf("%d ", *(p + i));}if (p == NULL){perror("malloc");return 1;}return 0;
}
上述是关于用malloc创建10个整型空间
malloc申请的空间与数组空间的区别:
1.动态内存的大小是可以调整的
2.存放的位置不一样
2.2free
C语言提供了另外一个函数free,专门是用来做动态内存的释放和回收的
头文件:stdlib.h
函数原型:
void free (void* ptr);
代码应用实例:
free(p);//p变成了野指针//p指向的空间不属于当前程序//但是还是可以找到原来的空间(空有地址无法使用)p = NULL;//为了更彻底,把p这个野指针用空指针拴住
free函数用来释放动态开辟的内存
如果参数ptr指向的空间不是动态开辟的,那么free函数的行为是未定义的
例子:
int main()
{int arr[20] = { 0 };free(arr);return 0;
}
-如果参数ptr是空指针,那么函数什么都不做
例子:
malloc和free一般都是一块使用
3.calloc和realloc
3.1calloc
C语言提供了一个函数叫calloc,calloc函数也用来动态内存分配
头文件:stdlib.h
函数模型:
void* calloc (size_t num, size_t size);
函数的功能是为num大小为size的元素开辟一块空间,并且把空间中每个字节初始化为0
与函数malloc的区别只在于calloc会返回地址之前把申请的空间的每个字节初始化为0
calloc函数的应用例子:
#include<stdlib.h>
int main()
{int* p = (int*)calloc(10, sizeof(int));int i = 0;for (i = 0; i < 10; i++){printf("%d ", p[i]);}if (p == NULL){return 1;}return 0;
}
运行结果为
2.2realloc
realloc函数使得动态内存管理更加灵活
有时候我们会发现申请的内存空间太小了,有时候又会觉得太大了,这时候我们就需要realloc函数对内存空间进行灵活的调整
头文件:stdlib.h
函数模型:
void* realloc (void* ptr, size_t size);
-ptr是要调整的内存
-size是调整之后的新大小
-返回值为调整之后的内存起始位置
-这个函数调整原内存空间大小的基础上,还会将原来内存中的数据移动到新的空间
-realloc在调整内存空间的是存在两种情况:
1.原有空间之后有足够大的空间:
直接在旧空间之后开辟空间,返回原来的空间地址
2.原有空间之后没有足够大的空间:
realloc函数直接在内存的堆区找一块新的满足大小的空间,并且将旧的数据拷贝到新的空间,然后释放旧的空间,返回新的地址
realloc函数使用的例子
#include<stdlib.h>
int main()
{int* p = (int*)calloc(10, sizeof(int));int i = 0;for (i = 0; i < 10; i++){printf("%d ", p[i]);}if (p == NULL){perror("calloc");return 1;}//如果空间不够int* ptr = (int*)realloc(p, 20 * sizeof(int));if (ptr == NULL){perror("realloc");return 1;}else{p = ptr;}free(p);p = NULL;return 0;
}
tips:
realloc不仅可以调整内存空间,还可以想malloc和calloc一样创建动态内存空间
int main()
{int* p = (int*)realloc(NULL, 40);//==malloc(40);return 0;
}
4.常见的动态内存的错误
4.1对NULL指针的解引用操作
不注意p是否为空指针的话就会出现上述代码中的错误
加上判断的话编译器就不会报错了
4.2对动态开辟空间的越界访问
4.3对非动态开辟内存使用free释放
//对非动态空间进行释放
int main()
{int arr[3] = { 0 };int* p = arr;free(p);p = NULL;return 0;
}
运行结果:
4.4使用free释放一部分动态内存空间
int main()
{int* p = (int*)malloc(10*sizeof(int));if (p == NULL){perror("malloc");return 1;}int i = 0;for (i = 0; i < 5; i++){*p = i;p++;//这里p的地址移动了,不再是原来的p}free(p);p = NULL;return 0;
}
运行结果:
4.5对同一块动态内存多次释放
int main()
{int* p = (int*)malloc(10*sizeof(int));if (p == NULL){perror("malloc");return 1;}int i = 0;for (i = 0; i < 40/*这里越界了*/; i++){p[i] = i;}free(p);//......free(p);//多次释放并且第一次没有将p赋为NULLp = NULL;return 0;
}
运行结果:
但如果第一次内存释放已经将p变成空指针NULL,那么多次释放也没事
因为p是空指针,所以函数free什么也不做
4.6动态开辟内存忘记释放(内存泄漏)
void test()
{int flag = 1;int* p = (int*)malloc(10 * sizeof(int));if (p == NULL){perror("malloc");return;}//使用......if (flag == 0)return;free(p);//看似进行了释放//但是前面的条件有一个符合就会提前结束函数,便会漏掉释放内存p = NULL;
}int main()
{test();//如果提前释放,那么就会发生内存泄漏//malloc创建的动态内存空间无法释放,也无法被找到//无法被找到是因为p只在test函数中使用,test函数也没有返回地址return 0;
}
总的来说,动态内存管理是一把双刃剑,既能提供灵活的内存管理方式,又会具有一定的风险
5.动态内存题目练习
5.1
char *GetMemory(void)
{char p[] = "hello world";return p;
}
void Test(void)
{char *str = NULL;str = GetMemory();printf(str);
}
int main()
{Test();return 0;
}
运行结果:程序会崩溃
解析:(注释)
void GetMemory(char* p)
{p = (char*)malloc(100);
}
void Test(void)
{char* str = NULL;GetMemory(str);//无返回值,创建malloc动态内存后也没有释放,也没有地址//造成内存泄露strcpy(str, "hello world");//这里对str这个NULL空指针进行了解引用//所以程序会崩溃printf(str);
}
int main()
{Test();return 0;
}
正确代码:
或者不用二级指针,只是将函数GetMemory加个返回值,返回malloc动态空间的地址
5.2
char* GetMemory(void)
{char p[] = "hello world";return p;
}
void Test(void)
{char* str = NULL;str = GetMemory();printf(str);
}
int main()
{Test();return 0;
}
运行结果:
解析:(注释)
char* GetMemory(void)
{char p[] = "hello world";return p;
}
void Test(void)
{char* str = NULL;str = GetMemory();//str的值变成了GM函数中p的地址printf(str);//printf可以通过str找到原来char p[] 的空间地址//但是没有访问权限,char p []只在GM函数中有效//所以str相当于野指针,无法访问,所以打印出来了这些
}
int main()
{Test();return 0;
}
str的使用是个返回栈空间的问题
5.3
void GetMemory(char** p, int num)
{*p = (char*)malloc(num);
}
void Test(void)
{char* str = NULL;GetMemory(&str, 100);strcpy(str, "hello");printf(str);
}int main()
{Test();return 0;
}
运行结果:
看似没有问题,hello也可以打印出来,但是遗漏了一个重要的问题
malloc这个动态内存没有进行释放,使得内存泄漏
改正:
void GetMemory(char** p, int num)
{*p = (char*)malloc(num);
}
void Test(void)
{char* str = NULL;GetMemory(&str, 100);strcpy(str, "hello");printf(str);free(str);str = NULL;
}int main()
{Test();return 0;
}
5.4
void Test(void){char *str = (char *) malloc(100);strcpy(str, "hello");free(str);if(str != NULL){strcpy(str, "world");printf(str);}}
int main()
{Test();return 0;
}
运行结果:
看似没问题,但是str使用了未初始化的内存,意思是str是个野指针,这里是野指针的非法访问,代码是错误的
改正:
void Test(void)
{char* str = (char*)malloc(100);strcpy(str, "hello");free(str);str = NULL;if (str != NULL)//本意应该是为检测str是否转化为NULL{strcpy(str, "world");printf(str);}
}
int main()
{Test();
6.柔性数组
C99中,结构体中的最后一个元素允许是未知大小的数组
两种写法:(有些编译器只能由其中一个写法)
struct S
{int a;float b;char c;int arr[];//未知数组
};struct S2
{int a;float b;int arr[0];
};
6.1柔性数组的特点
1.-结构中的柔性数组成员前面必须至少一个其他成员
2.-sizeof返回的这种结构大小不包括柔性数组的内存
3.-包括柔性数组成员的结构用malloc()函数进行内存分配,并且分配的内存应该大于结构的大小,以适应柔性数组的预期大小
struct S
{int n;int arr[];
};
int main()
{struct S s;//这个只创建了有int的结构体,不包含柔性数组的内存空间struct S* pf = (struct S*)malloc(sizeof(struct S) + 20 * sizeof(int));//这才是创建有柔性数组的结构体的代码return 0;
}
应用:
struct S
{int n;int arr[];
};
int main()
{struct S* pf = (struct S*)malloc(sizeof(struct S) + 20 * sizeof(int));if (pf == NULL){perror("malloc");return 1;}pf->n = 10;int i = 0;for (i = 0; i < 10; i++){pf->arr[i] = i;printf("%d\n", pf->arr[i]);}return 0;
}
运行结果:
由于是malloc创建的动态内存空间,所以可以用realloc来对内存进行调整
struct S
{int n;int arr[];
};
int main()
{struct S* pf = (struct S*)malloc(sizeof(struct S) + 20 * sizeof(int));if (pf == NULL){perror("malloc");return 1;}pf->n = 10;int i = 0;for (i = 0; i < 10; i++){pf->arr[i] = i;printf("%d\n", pf->arr[i]);}//调整空间struct S* ptr = (struct S*)realloc(pf, (sizeof(struct S) + 40 * sizeof(int)));if (ptr != NULL){pf = ptr;ptr = NULL;}else{return 1;}//使用//释放空间free(pf);pf = NULL;return 0;
}
6.2柔性数组的优势
还有一种类型也可以有柔性数组的作用
就是将柔性数组变成指向malloc创建动态内存的指针
struct S
{int n;int* arr;
};
int main()
{struct S* s = (struct S*)malloc(sizeof(struct S));int* pl = (int*)malloc(20 * sizeof(int));if (pl == NULL){perror("malloc");return 1;}else{s->arr = pl;}//use//......//调整内存int* ptr = (int*)realloc(pl, 40 * sizeof(int));if (ptr != NULL){pl = ptr;}else{perror("realloc");return 1;}//use......//endingfree(s->arr);free(pl);pl = NULL;return 0;
}
两者对比我们可以发现
柔性数组既方便内存的释放(释放一次即可),并且有利于提高访问速度
相关文章:
C语言-动态内存管理
1.为什么要有动态内存分配 我们现如今已经掌握的内存开辟方式有 int main() {int a 0;int arr[30] { 0 };return 0; } 这两种方式,但是这种开辟空间的方式有两个特点: 1.空间开辟大小是固定的 2.数组在申明的时候,必须指定数组的长度&…...
深入解析MySQL数据库分库分表技术
友情提示:本文内容由银河易创(https://ai.eaigx.com)AI创作平台gpt-4-turbo模型生成,仅供参考。 随着互联网应用的快速发展,单一数据库在面对大规模数据时可能会遇到性能瓶颈。因此,数据库分库分表作为一种…...
【Embedded World 2025:边缘 AI、存储革新与 1X nm 工艺重塑嵌入式未来】
Embedded World 2025于3月11-13日在德国纽伦堡举办,作为全球嵌入式系统领域顶级盛会,汇聚超千家展商与3万专业观众,聚焦嵌入式智能、安全管理及行业解决方案。展会呈现边缘AI、低功耗MCU、5G RedCap、新型存储及车规级技术等前沿方向…...
【人工智能基础2】机器学习、深度学习总结
文章目录 一、人工智能关键技术二、机器学习基础1. 监督、无监督、半监督学习2. 损失函数:四种损失函数3. 泛化与交叉验证4. 过拟合与欠拟合5. 正则化6. 支持向量机 三、深度学习基础:深度神经网络1、概念与原理2、多层神经网络训练方法 一、人工智能关键…...
MySQL如何存储表情符号?
存储表情符号 默认mysql的字符集是utf8,排序规则为 utf8_general_ci INSERT INTO department (name) VALUES (😄)在存储表情的时候会报 1366 - Incorrect string value: \xF0\x9F\x98\x84 for column name at row 1, Time: 0.007000s 这时需要修改字符…...
Unity Shader 学习16:全局光照 概念理解
- 全局光照 直接光 间接光,在没有开启GI的情况下是不计算间接光的(如果放了光照探针 倒是可以模拟间接光 <光照探针只影响动态物体>); - 处理对象:静态物体(static) 、 非静态(动态)物体; - 计算方…...
Jobby、Quarkus 和 Spring Boot对比
Jobby、Quarkus 和 Spring Boot 是三种不同的 Java 框架,各自有不同的设计目标和适用场景。以下是对它们的详细对比: 1. 设计目标 框架设计目标Jobby轻量级的任务调度框架,专注于任务调度和执行。Quarkus面向云原生和 Kubernetes 的 Java 框…...
Dubbo 服务发现
总览 学习 Dubbo 的服务发现机制,可以从以下几方面入手: 注册中心的配置服务的注册客户端拉取服务列表服务列表的本地缓存服务提供者列表变更的监听机制服务发现的接口设计 注册中心的配置 Dubbo 通过解析用户配置决定使用的注册中心。比如用户配置了…...
Pytorch使用手册—自定义 C++ 和 CUDA 运算符(专题五十一)
你将学到什么 如何将用 C++/CUDA 编写的自定义运算符与 PyTorch 集成如何使用 torch.library.opcheck 测试自定义运算符先决条件 1. PyTorch 2.4 或更高版本 2. 对 C++ 和 CUDA 编程有基本了解 注意 本教程也适用于 AMD ROCm,无需额外修改。 PyTorch 提供了一个庞大的运算符库…...
Linux 实时同步服务实现(Rsync 结合 Inotify)
文章目录 1. 实时同步服务介绍2. Inotify 机制介绍3. Inotify-toolRsync 实时同步实践3.1 确认远程数据传输服务部署完成3.2 检查Linux系统是否支持Inotify实时监控3.3 安装inotify-tools3.4 命令测试3.5 重要监控事件汇总3.6 使用步骤 4. Sersync 工具使用(重点&am…...
用Java写斗地主前期工作的一些小想法
目前我们并不是要实现一个游戏,而是要对斗地主游戏做准备,主要是做牌+洗牌+发牌+给发的牌进行排序。在这个过程中我希望通过集中方式来实现: 1. 使用集合+方法+字符串的运用完成以上功能 2. 使用面向对象思想,对1做改进,主要是对其排序的改进,从而理解面向对象的真正意…...
鸿蒙数据持久化之首选项
场景介绍 用户首选项为应用提供Key-Value键值型的数据处理能力,支持应用持久化轻量级数据,并对其修改和查询。当用户希望有一个全局唯一存储的地方,可以采用用户首选项来进行存储。Preferences会将该数据缓存在内存中,当用户读取…...
将bin文件烧录到STM32
将bin文件烧录到STM32 CoFlash下载生成hex文件hex2bin使用下载bin到单片机 CoFlash下载 选择需要安装的目录 在Config中可以选择目标芯片的类型 我演示的是 stm32f103c8t6 最小系统板 Adapter:烧录器类型 Max Clock:下载速度 Por:接口类型&am…...
AtCoder Beginner Contest 397(ABCDE)
目录 A - Thermometer 翻译: 思路: 实现: B - Ticket Gate Log 翻译: 思路: 实现: C - Variety Split Easy 翻译: 思路: 实现: D - Cubes 翻译:…...
jasypt-spring-boot-starter项目如何使用jasypt加密密码
import org.jasypt.encryption.pbe.StandardPBEStringEncryptor; import org.jasypt.iv.RandomIvGenerator; import org.jasypt.salt.RandomSaltGenerator;/*** 加密密码的工具** author xxx* since 2025-03-17*/ public class JasyptTest {public static void main(String[] a…...
[AI速读]混合语言IP集成:挑战与高效解决方案
在现代SoC(系统级芯片)设计中,IP(知识产权模块)复用是提升开发效率的关键。然而,当设计涉及多种硬件描述语言(如SystemVerilog、VHDL、SystemC)时,如何高效集成不同语言的IP模块成为一大难题。本文将从实际设计场景出发,探讨混合语言IP集成的核心挑战,并介绍一套方法…...
SpringSecurity——如何获取当前登录用户的信息
目录 1. 直接注入 Principal 2. 直接注入 Authentication 3. 注入 UsernamePasswordAuthenticationToken 4. 通过 SecurityContextHolder 获取 5. 使用自定义工具方法 总结 如何获取更多的用户信息 自定义用户实体类 如何忽略某些字段(不返回前端ÿ…...
ospf动态路由
一、为什么使用动态路由 OSPF(open shortest path first开放最短路径优先)是内部网关协议(IGP)的一种,基于链路状态算法(LS)。 OSPF企业级路由协议(RFC2328 OSPFv2),核心重点协议 OSPF共三个版本,OSPFV1主要是实验室…...
在react当中利用IntersectionObserve实现下拉加载数据
目录 一、传统的下拉加载方案 二、存在问题 1.性能较差 2.不够精确 三、IntersectionObserve版本下拉加载 1、callback 2、options 四、IntersectionObserver实例 1、Intersection的优势 2、实现思路 3、代码实现 在进行前端开发的过程中,常常会碰到下拉…...
SpringBoot之如何集成SpringDoc最详细文档
文章目录 一、概念解释1、OpenAPI2、Swagger3、Springfox4、Springdoc5. 关系与区别 二、SpringDoc基本使用1、导包2、正常编写代码,不需要任何注解3、运行后访问下面的链接即可 三、SpringDoc进阶使用1、配置文档信息2、配置文档分组3、springdoc的配置参数**1. 基…...
Transaction rolled back because it has been marked as rollback-only问题解决
transaction rolled back because it has been marked as rollback-only 简略总结> 发生场景:try-catch多业务场景 发生原因:业务嵌套,事务管理混乱,外层业务与内层业务抛出异常节点与回滚节点不一致。 解决方式:修…...
单片机写的小液晶屏驱动+汉字滚屏
单片机写的小液晶屏驱动汉字滚屏 stm32f401freertos内置HZK16 单片机汉字滚屏...
SpringBoot整合LangChain4j操作AI大模型实战详解
一、引言 在当今这个人工智能飞速发展的时代,AI大模型已经逐渐渗透到我们生活的方方面面,为企业和开发者带来了前所未有的机遇。然而,如何高效地接入并利用这些AI大模型,成为了摆在许多开发者面前的一道难题。SpringBoot作为一款…...
深度解析 | Android 13 Launcher3分页指示器改造:横线变圆点实战指南
一、需求背景与技术挑战 在Android 13系统定制开发中,我们面临将Launcher3桌面从传统双层架构优化为现代单层布局的挑战。原生系统采用的分页横线指示器在视觉呈现上存在两点不足: 风格陈旧不符合Material You设计规范 空间占用较大影响屏幕利用率 通…...
【Qt】private槽函数可以被其他类中的信号连接
private槽函数可以被其他类中的信号连接。 即使 B 类的槽函数是 private 的,A 类通过信号连接 B 类的槽函数也没有问题。这是因为 Qt 的信号和槽机制是通过元对象系统(Meta-Object System)实现的,而不是直接调用函数。只要信号和…...
C语言每日一练——day_7
引言 针对初学者,每日练习几个题,快速上手C语言。第七天。(连续更新中) 采用在线OJ的形式 什么是在线OJ? 在线判题系统(英语:Online Judge,缩写OJ)是一种在编程竞赛中用…...
Python --**kwargs
在 Python 中,**kwargs 是一个特殊语法,用于在函数定义中接收任意数量的关键字参数(即键值对参数),并将这些参数以字典形式存储。它是 Python 中处理动态参数的强大工具,适用于需要灵活传递参数的场景。 1.…...
网络编程之客户端通过服务器与另外一个客户端交流
服务器使用select模型搭建,客户端1使用线程搭建,客户端2使用poll模型搭建, 使用时需要先运行服务器,具体编译可看我最后的图片 head.h头文件 #ifndef __HEAD_H_ #define __HEAD_H_ #include <stdio.h> #include <string…...
mybatis集合映射association与collection
官方文档:MyBatis的一对多关联关系 一、用途 一对一:association 一对多:collection 二、association 比较容易理解,可参考官方文档 三、collection <?xml version"1.0" encoding"UTF-8"?> &l…...
windows克隆项目找不到,修改git bash中存储的账号密码
git clone项目找不到,提示:remote: The project you were looking for could not be found. 有可能是地址错误、没有权限、账号密码错误 1.地址错误 从新检查git地址,确保地址是正确的。 2.没有权限 确保你有访问该项目的权限 3.账号密码…...
Linux中安装redis
Redis的安装包,从官方下载下来的是c语言的源码包,我们需要自己编译安装。具体操作步骤如下: 安装redis 上传redis资源包 安装C语言的编译环境 gcc yum install -y gcc-c 解压redis源码在当前目录 tar -zxvf redis-6.2.4.tar.gz 进入解压目录…...
Springboot项目打包成war包
1、首先创建一个springboot工程,然后我们改造启动类如: import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuil…...
Word:双栏排版操作步骤及注意事项
将word单栏文字排版为双栏是论文投稿前的重要步骤,也是非常容易出错的一步。但事实上排版的操作并不复杂,本篇博客旨在把操作过程及注意事项简单记录下来,便于日后浏览和查询。 【Step1】打开“显示/隐藏段落标记” (ctrl*&#…...
ArcGIS10. 8简介与安装,附下载地址
目录 ArcGIS10.8 1. 概述 2. 组成与功能 3. 10.8 特性 下载链接 安装步骤 1. 安装准备 2. 具体步骤 3.补丁 其他版本安装 ArcGIS10.8 1. 概述 ArcGIS 10.8 是由美国 Esri 公司精心研发的一款功能强大的地理信息系统(GIS)平台。其核心功能在于…...
MySQL:数据库基础
数据库基础 1.什么是数据库?2.为什么要学习数据库?3.主流的数据库(了解)4.服务器,数据库,表之间的关系5.数据的逻辑存储6.MYSQL架构7.存储引擎 1.什么是数据库? 数据库(Database,简称DB)&#x…...
数据结构-----初始数据结构、及GDB调试
一、数据结构核心概念 相互之间存在一种或多种特定关系的数据元素的集合。 1. 数据结构定义 // 嵌入式场景示例:传感器网络节点结构 struct SensorNode {uint16_t node_id; // 2字节float temperature; // 4字节uint32_t timestamp; // 4字节struct Se…...
go面向对象编程三大特性,封装、继承和多态
1.简介 go具有面向对象编程的封装、继承和多态的特性,只是实现的方式和其它OOP语言不一样,下面看下go的三大特性是如何实现的。 2.封装 2.1基本介绍 封装就是把抽象出的字段和对字段的操作封装在一起,数据被保护在内部,程序的其它包只能通过被授权的操作(方法),才能…...
华为ISC+战略规划项目数字化转型驱动的智慧供应链革新(169页PPT)(文末有下载方式)
资料解读:华为ISC战略规划项目数字化转型驱动的智慧供应链革新 详细资料请看本解读文章的最后内容。 华为的ISC战略规划项目是其供应链数字化转型的核心,旨在通过智慧供应链的革新,提升企业的竞争力和运营效率。本文将从多个维度详细解读这…...
算法刷题记录——LeetCode篇(10) [第901~1000题](持续更新)
(优先整理热门100及面试150,不定期持续更新,欢迎关注) 994. 腐烂的橘子 在给定的 m x n 网格 grid 中,每个单元格可以有以下三个值之一: 值 0 代表空单元格;值 1 代表新鲜橘子;值 2 代表腐烂的橘子。 每…...
Python中的字典:深度解析与应用实践
一、字典的本质与特性 Python字典(Dictionary)是以**键值对(Key-Value Pair)**形式存储数据的无序集合,使用大括号{}定义。其核心特性包括: 快速查找:基于哈希表实现,通过键&#…...
jmeter配件元素
jmeter配件元素 CSV Data Set Config名词解释测试场景Recycle on EOF:False配置测试结果 Recycle on EOF:True配置测试结果 Sharing mode:All Threads配置测试结果 Sharing mode:Current thread group配置测试结果 Sharing mode:Current thread配置测试结果 HTTP Header Manage…...
VSCode + CMake
参考文献: 如何用 GCC, CMake 和 Make 编译C/C代码Windows 上的 Linux 子系统:WSLWSL:桌面 UI 远程连接 RDP 配置 VScode 文章目录 CMake 配置VSCode 配置launch.jsontask.jsonc_cpp_properties.json CMake 配置 编写如下的 CmakeLists.t…...
JVM的一些知识
JVM简介 JVM 是 Java Virtual Machine 的简称,意为 Java 虚拟机。 虚拟机是指通过软件模拟的具有完整硬件功能的、运行在一个完全隔离的环境中的完整计算机系统。常见的虚拟机:JVM、VMwave、Virtual Box。 JVM 和其他两个虚拟机的区别: VMw…...
SpringCloud网关:Gateway路由配置与过滤器链
文章目录 引言一、Gateway基本架构二、路由配置方式2.1 配置文件方式2.2 Java代码方式 三、内置断言工厂四、内置过滤器工厂4.1 请求路径相关过滤器4.2 请求和响应头过滤器4.3 功能性过滤器 五、自定义过滤器5.1 自定义GatewayFilter5.2 自定义过滤器工厂 六、全局过滤器总结 引…...
Git 分支使用规范全解(多人协作开发适用)
🚀 Git 分支使用规范全解(多人协作开发适用) 本文将为你梳理一套清晰、标准、适合企业/团队使用的 Git 分支管理策略,适用于前后端、边缘端、AI项目等多种场景。 🧩 为什么要规范分支管理? 防止多人协作混乱、冲突频发清晰区分:开发中 / 待发布 / 已上线 的版本快速定…...
【华三】路由器交换机忘记登入密码或super密码的重启操作
【华三】路由器交换机忘记登入密码或super密码的重启操作 背景步骤跳过认证设备:路由器重启设备翻译说明具体操作 跳过当前系统配置重启设备具体操作 背景 当console口的密码忘记,或者说本地用户的密码忘记,其实这时候是登入不了路由器的&am…...
Linux驱动开发进阶 - 文件系统
文章目录 1、前言2、学习目标3、VFS虚拟文件系统3.1、超级块(Super Block)3.2、dentry3.3、inode3.4、file 4、文件系统的挂载5、文件系统的注册5.1、文件系统的注册过程5.1.2、定义文件系统类型5.1.3、注册文件系统5.1.4、注销文件系统 5.2、文件系统的…...
Mac:JMeter 下载+安装+环境配置(图文详细讲解)
📌 下载JMeter 下载地址:https://jmeter.apache.org/download_jmeter.cgi 📌 无需安装 Apache官网下载 JMeter 压缩包,无需安装,下载解压后放到自己指定目录下即可。 按我自己的习惯,我会在用户 jane 目…...
蓝桥杯备考:图论之Prim算法
嗯。通过我们前面的学习,我们知道了,一个具有n个顶点的连通图,它的生成树包括n-1个边,如果边多一条就会变成图,少一条就不连通了 接下来我们来学一下把图变成生成树的一个算法 Prim算法,我们从任意一个结…...
Linux 文件操作-标准IO函数3- fread读取、fwrite写入、 fprintf向文件写入格式化数据、fscanf逐行读取格式化数据的验证
目录 1. fread 从文件中读取数据 1.1 读取次数 每次读取字节数 < 原内容字节数 1.2 读取次数 每次读取字节数 > 原内容字节数 2.fwrite 向文件中写入数据 2.1写入字符串验证 2.2写入结构体验证 3. fprintf 将数据写入到指定文件 4. fscanf 从文件中逐行读取内容…...