C语言第18节:自定义类型——联合和枚举
1. 联合体
C语言中的联合体(Union)是一种数据结构,它允许在同一内存位置存储不同类型的数据。不同于结构体(struct
),结构体的成员各自占有独立的内存空间,而联合体的所有成员共享同一块内存区域。这意味着在同一时间,联合体中只能存储一个成员的值,其他成员会被覆盖。
1.1 联合体的基本语法
联合体的声明与结构体相似,使用关键字union
来定义。
编译器只为最大的成员分配足够的内存空间。联合体的特点是所有成员共用同一块内存空间。所以联合体也叫:共用体。
一个简单的联合体例子如下:
#include <stdio.h>union Data {int i;float f;char str[20];
};int main() {union Data data;data.i = 10;printf("data.i = %d\n", data.i);data.f = 220.5;printf("data.f = %.2f\n", data.f);// 注意,data.i的值会被覆盖printf("data.i = %d\n", data.i); // 这个值会发生变化return 0;
}
1.2 联合体的内存分配与大小计算
在C语言中,联合体的所有成员都共享同一块内存区域。当你定义一个联合体时,它的内存空间并不会为每个成员分配独立的内存,而是为所有成员分配一块共享的内存区域。这样,联合体的内存大小至少等于成员中最大类型的成员大小。
举个例子:
#include <stdio.h>union Data {int i; // 4 字节float f; // 4 字节char str[20]; // 20 字节
};int main() {printf("Size of union Data: %lu\n", sizeof(union Data));return 0;
}
解释:
int i
通常占用 4 字节。float f
通常也占用 4 字节。char str[20]
占用 20 字节(每个字符占 1 字节)。
由于联合体的成员共享内存,它的大小等于其中最大成员的大小。在这个例子中,char str[20]
的大小是 20 字节,因此联合体的大小会是 20 字节。换句话说,联合体的内存分配通常是由它的最大成员决定的,且内存中只能保存一个成员的数据。
输出:
Size of union Data: 20
1.2.1 联合体的内存对齐
除了最大成员的大小外,还要注意内存对齐(memory alignment)。C语言中,对于每个数据类型,通常都有对齐要求。具体对齐方式与系统架构、编译器有关(在C语言第17节:自定义类型——结构体已经讲过了,点击链接即可查看)。内存对齐的目的是为了提高访问效率,因此编译器往往会将数据类型按一定的字节边界对齐(例如,4字节对齐、8字节对齐等)。
内存对齐的示例:
假设我们使用的是32位或64位的架构,它可能要求对齐到4字节边界。我们来观察一下一个包含不同类型成员的联合体的内存分配。
// VS2022 MSVC
#include <stdio.h>union Example {char c; // 1 字节int i; // 4 字节double d; // 8 字节
};int main() {printf("Size of union Example: %lu\n", sizeof(union Example));return 0;
}
解释:
char c
占用 1 字节。int i
占用 4 字节。double d
占用 8 字节。
但由于内存对齐的原因,联合体的实际大小可能会比这些单独成员的大小之和要大。通常,为了提高访问速度,编译器会插入一些填充字节(padding),使得联合体的内存大小是最大对齐数的倍数。
输出:
Size of union Example: 8
为什么是8字节呢?因为联合体中最大成员是double d
,它的大小是8字节,而且对齐数也是8。因此,整个联合体的大小会是8字节。
1.2.2 联合体内存分配的详细说明
- 成员共享内存:
- 联合体中的所有成员共享同一块内存区域。在任何时刻,联合体的内存中只会保存一个成员的值。
- 联合体的大小通常由最大成员的大小决定,因为它必须能够容纳最大成员的数据。
- 内存对齐:
- 编译器为了提高数据访问的效率,会根据平台的对齐要求插入填充字节(padding)。内存对齐确保数据按适当的字节边界存放(例如,4字节对齐、8字节对齐),从而使得CPU可以更快速地访问这些数据。
- 在一些平台上,数据类型可能有特定的对齐要求。
- 联合体的大小计算:
- 联合体的大小通常等于其最大成员的大小,但是,为了满足内存对齐的要求,联合体的实际大小可能会大于最大成员的大小。它会被填充到最接近对齐要求的倍数。
- 内存对齐填充通常是由编译器自动管理的,但了解这一点对于理解联合体的内存分配非常重要。
1.2.3 进一步的例子:多成员联合体与内存对齐
假设我们有一个更复杂的联合体,其中包含不同类型的数据,并且考虑到内存对齐的影响:
#include <stdio.h>union Complex {char c[21]; // 21 字节int i; // 4 字节double d; // 8 字节short s; // 2 字节
};int main() {printf("Size of union Complex: %lu\n", sizeof(union Complex));return 0;
}
分析:
char c[21]
:这是一个字符数组,它占用21字节(每个字符占1字节)。没有对齐要求。int i
:整数类型,通常占用4字节。要求 4 字节对齐,即它会被存储在4字节对齐的位置。double d
:双精度浮点类型,通常占用8字节。要求 8 字节对齐,因此它会被存储在8字节对齐的位置。short s
:短整型,通常占用2字节。要求 2 字节对齐,它会被存储在2字节对齐的位置。
联合体的实际大小
- 联合体的大小由最大对齐数决定。在这个例子中,最大成员是
double d
(虽然char c[21]
占用了 21 字节,但是其对齐数取决于存储的元素,即其对齐数为char
的对齐数1
),它的大小是 8 字节,其对齐数为 8 。因此,联合体的大小将是 8 字节的倍数。 - 即使
char c[21]
占用了 21 字节,但联合体的总大小会由于对齐要求被填充到适合最大成员对齐的大小。
因此,联合体的实际大小会是 24 字节。 这是因为:
double d
会占用 8 字节,并且需要 8 字节对齐,因此联合体的总大小将被填充到最接近8字节对齐的倍数,即 24 字节。
1.2.4 总结
- 联合的大小至少是最大成员的大小。
- 当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。
1.3 联合体的特点
-
共享内存:联合体的所有成员共享同一块内存区域,因此一个联合变量的大小,至少是最大成员的大小。
例子:
#include <stdio.h>union Data {int i;float f;char str[20]; };int main() {union Data data;printf("&data: %p\n", &data);printf("&data.i: %p\n", &data.i);printf("&data.f: %p\n", &data.f);printf("data.str: %p\n", data.str);return 0; }
-
只能存储一个成员的值:每次只能访问联合体中的一个成员。给一个成员赋值时,其他成员的值会被覆盖。
-
节省内存空间:联合体在节省内存方面非常有用,尤其是当你需要存储多种不同类型的数据,但在任何时刻只需要其中一个类型的数据时。
例子:
#include <stdio.h> #include <string.h> union Data {int i;float f;char str[20]; };int main() {union Data data;strcpy(data.str, "abcdefgh");data.i = 0x11223344;return 0; }
![]() | ![]() |
1.4 访问联合体成员
联合体成员可以通过.
(点)操作符访问。例如:
union Data data;
data.i = 100;
printf("data.i = %d\n", data.i); // 输出100data.f = 98.6;
printf("data.f = %.2f\n", data.f); // 输出98.6
1.5 联合体的使用场景
1.5.1 场景①
在网络通信中,我们经常需要处理不同类型的数据包。这些数据包的内容可能会根据协议的不同而有所不同。例如,有些协议可能传输整数数据,有些可能传输浮动数数据,还有些可能传输字符串数据。在这种情况下,我们可以使用联合体来处理这些不同的数据格式。
场景描述:
假设你正在开发一个通信协议处理程序,该程序需要解析网络传输过来的数据包。每个数据包的类型和内容可能会有所不同,但在任何时刻,每个数据包只会包含一种类型的数据。为了节省内存,你可以使用联合体来存储不同类型的数据。
- 协议A 可能会传输一个 整数(比如用户ID)。
- 协议B 可能会传输一个 浮动数(比如温度传感器的数据)。
- 协议C 可能会传输一个 字符串(比如设备状态信息)。
通过联合体,你可以为这些数据包定义一个结构,使得它们共享同一块内存。每次你收到一个数据包时,根据协议类型,你可以决定是存储整数、浮动数,还是字符串,但内存中始终只有一种数据。
优势:
- 节省内存:由于不同数据类型共享内存,只有在需要时,才会使用最大类型的内存(例如字符串可能占用更多的字节)。
- 灵活性:能够处理不同协议的数据格式,只需要用一个联合体存储数据。
这个场景在 网络通信、嵌入式系统、文件格式解析 等领域非常常见,特别是在需要处理多种类型数据的系统中。
1.5.2 场景②
姓名 | 性别 | 年龄 | 婚姻状况 | 婚姻状况标记 | |||||
未婚 | 已婚 | 离婚 | |||||||
结婚日期 | 配偶姓名 | 子女数量 | 离婚日期 | 子女数量 |
struct Person // 定义职工个人信息结构体类型
{char name[20]; // 姓名char sex; // 性别int age; // 年龄union MaritalState marital; // 婚姻状况int marryFlag; // 婚姻状况标记
};union MaritalState // 定义婚姻情况共用体
{int single; // 未婚struct MarriedState married; // 已婚struct DivorceState divorce; // 离婚
};struct MarriedState // 定义已婚结构体类型
{struct Date marryDay; // 结婚日期char spouseName[20]; // 配偶姓名int child; // 子女数量
};struct DivorceState // 定义离婚结构体类型
{struct Date divorceDay; // 离婚日期int child; // 子女数量
};struct Date
{int year;short month;short day;
};
1.6 联合体判断大小端
int check_sys()
{union{int i;char c;}un;un.i = 1;return un.c;//返回1是小端,返回0是大端
}
在C语言第16节:数据在内存中的存储已经讲过,这里不再赘述。
2. 枚举类型
C语言中的枚举类型(enum
)是一种用户自定义的数据类型,用于表示一组具名的常量。枚举类型将一组相关的常量组合在一起,并赋予它们有意义的名字。使用枚举可以使程序的代码更加清晰、易于理解和维护。
一周的星期一到星期日是有限的7天,可以一 一列举
性别有:男、女、保密,也可以一 一列举
月份有12个月,也可以一 一列举
三原色,也是可以一 一列举
2.1 枚举类型的基本语法
定义枚举类型的语法如下:
enum 枚举名 {常量1 = 值1,常量2 = 值2,常量3 = 值3,...
};
枚举名
是枚举类型的名称。常量
是枚举中的各个值,通常是一些具名常量,默认情况下,枚举常量从0
开始,依次递增,除非你为它们指定了不同的值。
2.1.1 例子:基本枚举类型
#include <stdio.h>enum Day {Sunday, // 默认值为 0Monday, // 默认值为 1Tuesday, // 默认值为 2Wednesday, // 默认值为 3Thursday, // 默认值为 4Friday, // 默认值为 5Saturday // 默认值为 6
};int main() {enum Day today;today = Wednesday; // today 被赋值为 3printf("Today is day number: %d\n", today); // 输出:Today is day number: 3return 0;
}
2.2 枚举常量的默认值
如果你没有为枚举常量指定值,默认情况下,第一个常量的值为 0,后续常量的值依次递增 1。例如,在上面的代码中,Sunday
默认值为 0,Monday
为 1,依此类推。
2.3 枚举常量的自定义值
你可以手动为枚举常量指定值。这意味着你可以设置任意值,而不依赖于默认的递增规则。
#include <stdio.h>enum Day {Sunday = 1, // 设定为 1Monday = 2, // 设定为 2Tuesday = 5, // 设定为 5Wednesday = 7, // 设定为 7Thursday, // 默认递增,从 8 开始Friday, // 9Saturday // 10
};int main() {enum Day today;today = Thursday; // today 被赋值为 8printf("Today is day number: %d\n", today); // 输出:Today is day number: 8return 0;
}
在这个例子中,Sunday
和 Monday
的值分别被设置为 1 和 2,而其他常量则从 Wednesday
开始自动递增。
2.4 枚举类型的实际应用
枚举常常用于表示一些固定的状态或选项,比如星期几、颜色、方向、状态码等。它能够使代码更加清晰,减少硬编码的数字。
2.4.1 例子:使用枚举表示交通信号灯的状态
#include <stdio.h>enum TrafficLight {Red, // 0Yellow, // 1Green // 2
};int main() {enum TrafficLight signal;signal = Green;if (signal == Green) {printf("Go!\n");} else if (signal == Yellow) {printf("Caution!\n");} else {printf("Stop!\n");}return 0;
}
在这个例子中,TrafficLight
枚举表示了交通信号灯的三个状态:红灯、黄灯和绿灯。每个状态有一个默认的整数值:Red
为 0,Yellow
为 1,Green
为 2。通过这种方式,代码更易理解,避免了使用数字来表示信号灯的状态。
2.5 枚举类型的大小
在 C 语言中,枚举类型的大小与编译器的实现有关。通常,编译器会根据枚举常量的取值范围来决定枚举类型的存储大小。如果枚举的值在 int
类型的范围内,编译器通常会选择 int
类型来存储枚举值。但有些编译器可能根据需要进行优化,使用较小的存储类型。
可以使用 sizeof
来查看枚举类型的大小:
#include <stdio.h>enum Color {Red = 1,Green,Blue
};int main() {printf("Size of enum Color: %lu\n", sizeof(enum Color)); // 输出枚举类型的大小return 0;
}
2.6 枚举类型的转换
枚举常量本质上是整数,因此可以将它们转换为整数类型,或者将整数值赋给枚举变量。但要注意,这种做法可能会导致不符合预期的结果。
#include <stdio.h>enum Day {Sunday = 1,Monday = 2,Tuesday = 3
};int main() {enum Day today;today = 2; // 可以将整数赋给枚举变量printf("Today is day number: %d\n", today); // 输出:Today is day number: 2return 0;
}
拿整数给枚举变量赋值在C语言中是可以的,但是在C++是不行的,C++的类型检查比较严格。
2.7 枚举的优势
- 提高代码可读性:枚举常量有具名的标识符,使代码更具语义。
- 减少硬编码数字:避免了在代码中使用没有含义的数字常量。
- 防止非法值:枚举确保变量只能取定义好的值。
- 简化调试:具名常量方便在调试时辨识。
- 增强维护性:修改枚举值时,只需要更改枚举定义,无需修改多个代码位置。
- 与
switch
语句结合使用:枚举常量使得switch
语句的条件判断更加清晰。 - 支持位域:与位运算结合使用,可以用来表示多个标志位。
—完—
相关文章:
C语言第18节:自定义类型——联合和枚举
1. 联合体 C语言中的联合体(Union)是一种数据结构,它允许在同一内存位置存储不同类型的数据。不同于结构体(struct),结构体的成员各自占有独立的内存空间,而联合体的所有成员共享同一块内存区域…...
2025年二级建造师报名流程图解
2025年二级建造师报名时间!附报名流程! ⏰️已公布25年二建考试时间的省份如下: ️4月19日、20日考试的城市有:贵州 ️5月10日、11日考试的城市有:湖北、陕西、宁夏、甘肃、福建、浙江、江西、黑龙江、河南、湖南、…...
AWTK fscript 中的 TCP/UDP 客户端扩展函数
fscript 是 AWTK 内置的脚本引擎,开发者可以在 UI XML 文件中直接嵌入 fscript 脚本,提高开发效率。本文介绍一下 fscript 中的 TCP/UDP 客户端扩展函数。 1.iostream_tcp_create 创建 TCP 客户端输入输出流对象。 原型 iostream_tcp_create(host, por…...
用php tp6对接钉钉审批流的 table 表格 明细控件 旧版sdk
核心代码 foreach ($flows[product_list] as $k>$gift) {$items_list[] [[name > 商品名称, value > $gift[product_name] ?? ],[name > 规格, value > $gift[product_name] ?? ],[name > 数量, value > $gift[quantity] ?? ],[name > 单位, v…...
【DuodooBMS】给PDF附件加“受控”水印的完整Python实现
给PDF附件加“受控”水印的完整Python实现 功能需求 在实际工作中,许多文件需要添加水印以标识其状态,例如“受控”“机密”等。对于PDF文件,添加水印不仅可以增强文件的可识别性,还可以防止未经授权的使用。本代码的功能需求是…...
前缀和算法篇:解决子数组累加和问题
前缀和算法篇:解决子数组累加和问题 1.前缀和原理 那么在介绍前缀和的原理之前,那么我们先来说下前缀和最基本的一个应用场景,那么就是如我们标题所说的子数组累加和问题,那么假设我们现在有一个区间为[L,R]的数组,那…...
大语言模型多代理协作(MACNET)
大语言模型多代理协作(MACNET) Scaling Large-Language-Model-based Multi-Agent Collaboration 提出多智能体协作网络(MACNET),以探究多智能体协作中增加智能体数量是否存在类似神经缩放定律的规律。研究发现了小世界协作现象和协作缩放定律,为LLM系统资源预测和优化…...
vue项目使用vite和vue-router实现history路由模式空白页以及404问题
开发项目的时候,我们一般都会使用路由,但是使用hash路由还是history路由成为了两种选择,因为hash路由在url中带有#号,history没有带#号,看起来更加自然美观。但是hash速度更快而且更通用,history需要配置很…...
【Linux】从一台windows电脑访问局域网下另一台linux电脑详细操作步骤
以下是在Windows电脑B上访问Linux电脑A的文件并使用bash终端的详细步骤: 一、在Linux电脑A上配置SSH服务(用于终端操作) 安装SSH服务 sudo apt update && sudo apt install openssh-server启动SSH服务并设置开机自启 sudo systemctl …...
Makefile的用法及算法应用
编译的过程 算法:解决特定问题的求解步骤 算法的设计 1.正确性 语法正确合法的输入能得到合理的结果对非法的输入,给出满足要求的规格说明对精心选择,甚至刁难的测试都能正常运行,结果正确 2.可读性,便于交流&…...
Elasticsearch:15 年来致力于索引一切,找到重要内容
作者:来自 Elastic Shay Banon 及 Philipp Krenn Elasticsearch 刚刚 15 岁了!回顾过去 15 年的索引和搜索,并展望未来 15 年的相关内容。 Elasticsearch 刚刚成立 15 周年。一切始于 2010 年 2 月的一篇公告博客文章(带有标志性的…...
MongoDB 扩缩容实战:涵盖节点配置、服务启动与移除操作
#作者:任少近 文章目录 一、扩容在245节点上配置配置config server:配置mongos启动config server安装工具mongosh添加245新节点到副本集配置分片副本集启动路由并分片 二、缩容Conf server上去掉server4shard上去掉server4mongos上去掉server4 一、扩容…...
Bitmap在数仓中的应用
一、背景 在数据仓库的日常工作中,我们经常需要面对海量数据的存储和高效查询问题。尤其是,当业务对性能的要求越来越高、数据量持续增长时,传统的处理方式往往显得笨拙而低效。而这时候,Bitmap(位图)作为…...
C++病毒(^_^|)(2)
第二期 声明: 仅供损害电脑,不得用于非法。损坏电脑,作者一律不负责。此作为作者原创,转载请经过同意。 直接上代码 #include <bits/stdc.h> #include <windows.h> using namespace std; HHOOK g_hHook;void lrud(…...
Linux 内核架构入门:从基础概念到面试指南*
1. 引言 Linux 内核是现代操作系统的核心,负责管理硬件资源、提供系统调用、处理进程调度等功能。对于初学者来说,理解 Linux 内核的架构是深入操作系统开发的第一步。本篇博文将详细介绍 Linux 内核的架构体系,结合硬件、子系统及软件支持的…...
leetcode-495.提莫攻击
leetcode-495.提莫攻击 文章目录 leetcode-495.提莫攻击一.题目描述二.代码提交三.解释 一.题目描述 二.代码提交 #include <vector> using namespace std;int findPoisonedDuration(vector<int>& timeSeries, int duration) {int total 0;for (int i 0; i …...
mysql 参数max_connect_errors研究
1.在server端设置max_connect_errors3,超过3次连接错误就block mysql> set global max_connect_errors3; Query OK, 0 rows affected (0.00 sec) mysql> show variables like max_connect_errors; --------------------------- | Variable_name | Value…...
vscode无法ssh连接远程机器解决方案
远程服务器配置问题 原因:远程服务器的 SSH 服务配置可能禁止了 TCP 端口转发功能,或者 VS Code Server 在远程服务器上崩溃。 解决办法 检查 SSH 服务配置:登录到远程服务器,打开 /etc/ssh/sshd_config 文件,确保以下…...
sql盲注获取数据库的表名、列名和具体数据
1.时间盲注 获取表名 sql id1 AND IF(ASCII(SUBSTRING((SELECT table_name FROM information_schema.tables WHERE table_schemaDATABASE() LIMIT 1),1,1))97, SLEEP(5), 0) 获取列名 sql id1 AND IF(ASCII(SUBSTRING((SELECT column_name FROM information_schema.col…...
清华大学新闻与传播学院沈阳团队出品的《DeepSeek:从入门到精通》104页PDF
前言 本机运行DeepSeek R1大模型文章如下: Windows电脑本地部署运行DeepSeek R1大模型(基于Ollama和Chatbox)【保姆级万字教程】在Windows计算机部署DeepSeek大模型,给在实验室无外网的同事们用(基于Ollama和OpenWebUI…...
使用sublime_text中,TAB键无效怎么解决???
如果你也有这样的困扰,请你跟着我下面的步骤操作 点击首选项(如下图所示) 找到下面这段代码并注释掉 { “keys”:[“tab”], “args”:{“action”:“expand_abbreviation”}, “command”:“run_emmet_action”, “context”:[ { “key”:“…...
Java IO流详解
1. IO概述 IO(Input/Output)即输入和输出,指的是设备或环境之间进行数据的输入或输出。例如,键盘是输入设备,显示器是输出设备。在Java中,输入输出问题通过流(Stream)对象来解决。以…...
智慧农业-虫害及生长预测
有害生物防控系统是一个综合性的管理体系,旨在预防和控制对人类生活、生产甚至生存产生危害的生物。这些生物可能包括昆虫、动物、植物、微生物乃至病毒等。 一、系统构成 1、监测预警系统:利用智能传感器、无人机、遥感技术等手段,实时监测…...
ASIL D要达到多少fit
ASIL(Automotive Safety Integrity Level,汽车安全完整性等级)D是ISO 26262标准中最高等级的安全要求,其对应的随机硬件故障概率目标(以FIT表示)需满足以下要求: ASIL D的FIT目标 根据 ISO 262…...
与传统光伏相比 城电科技的光伏太阳花有什么优势?
相比于传统光伏,城电科技的光伏太阳花有以下优势: 一、发电效率方面 智能追踪技术:光伏太阳花通过内置的智能追踪系统,采用全球定位跟踪算法,能够实时调整花瓣(即光伏板)的角度,确…...
2025年SEO工具有哪些?老品牌SEO工具有哪些
随着2025年互联网的发展和企业线上营销的日益重要,SEO(搜索引擎优化)逐渐成为了提高网站曝光率和流量的重要手段。SEO的工作不仅仅是简单地通过关键词优化和内容发布就能够实现的,它需要依赖一系列专业的SEO工具来帮助分析、监测和…...
深入解析与解决 Oracle 报错:ORA-29275 部分多字节字符20250213
🛠️ 深入解析与解决 Oracle 报错:ORA-29275 部分多字节字符 引言 🌟 在与 Oracle 数据库打交道的日常工作中,你是否遇到过 ORA-29275: partial multibyte character 这个令人头疼的错误?这个错误通常与字符编码、数…...
HTML应用指南:利用GET请求获取全国海底捞门店位置信息
随着新零售业态的快速发展,门店位置信息的获取变得越来越重要。作为餐饮服务行业的先锋,海底捞不仅在服务质量上持续领先,还积极构建广泛的门店网络,以支持其不断增长的用户群体。为了更好地理解和利用这些数据,本篇文…...
数据流图和数据字典
在面向结构的分析和设计阶段,**数据流图(Data Flow Diagram, DFD)和数据字典(Data Dictionary)**是两个非常重要的工具,它们分别从不同的角度描述系统的功能和数据结构,帮助开发团队更好地理解和…...
Ubuntu 22.04 LTS 安装MinerU
1. 检测是否已安装nvidia驱动 nvidia-smi 如果看到类似如下的信息,说明已经安装了nvidia驱动,可以跳过步骤2 Note CUDA Version 显示的版本号应 > 12.1,如显示的版本号小于12.1,请升级驱动 2. 安装驱动 如没有驱动&#…...
OPEN CODER : THE OPEN COOKBOOK FOR TOP -TIER CODE LARGE LANGUAGE MODELS
Abstract 大型语言模型(LLMs)在代码领域已经成为不可或缺的工具,包括代码生成、推理任务和代理系统等多个方面。虽然开放获取的代码LLMs的性能越来越接近专有模型,但适合严格科学研究的优质代码LLMs,特别是那些具有可…...
C语言中printf()函数,格式输出符
在 C 语言中,printf() 函数的格式输出符(格式说明符)用于控制输出的格式和数据类型。以下是常见的格式说明符及其用法: 基本格式符 打印各种类型的值 格式输出符数据类型说明%dint输出有符号十进制整数%uunsigned int输出无符号…...
EasyRTC嵌入式WebRTC视频通话SDK支持Web浏览器、Linux、ARM、Android、iOS
随着互联网技术的飞速发展,实时通信(RTC)已经成为现代应用中不可或缺的一部分。无论是视频会议、在线教育、远程医疗,还是社交娱乐,实时通信技术都在其中扮演着重要角色。 然而,WebRTC技术在PC和移动端的支…...
【JS球球大作战项目实战】+在线体验
个人名片: 🐼作者简介:一名大三在校生,喜欢AI编程🎋 🐻❄️个人主页🥇:落798. 🐼个人WeChat:hmmwx53 🕊️系列专栏:🖼️…...
PHP高效、轻量级表格数据处理库 OpenSpout ,很好用
OpenSpout 是一个高效、轻量级的 PHP 库,用于处理电子表格文件(如 Excel 和 CSV)。它支持读取和写入大型文件,且内存占用低。本文将详细介绍如何安装和使用 OpenSpout。 目录 安装 基本使用 高级功能 参考文档 安装 OpenSp…...
数据库第三次作业
第一题: 学生表:Student (Sno, Sname, Ssex , Sage, Sdept) 学号,姓名,性别,年龄,所在系 Sno为主键 课程表:Course (Cno, Cname,) 课程号,课程名 Cno为主键 学生选课表:S…...
Mac 下使用多版本 Node
一、导读 使用 n 实现 Mac 下 Nodejs 的多版本切换,需要先安装一个版本的 Node.js,然后使用 npm 安装 n,再通过 n 管理 node 的多版本切换。 二、使用 npm 全局安装 n sudo npm install -g n 三、根据需求安装指定版本的 node sudo -E n…...
【油猴脚本/Tampermonkey】DeepSeek 服务器繁忙无限重试(20250214优化)
目录 一、 引言 二、 逻辑 三、 源代码 四、 添加新脚本 五、 使用 六、 BUG 七、 优化日志 1.获取最后消息内容报错 2.对话框切换无法正常使用 一、 引言 deepseek演都不演了,每次第一次提问就正常,后面就开始繁忙了,有一点阴招全…...
安全测试|SSRF请求伪造
前言 SSRF漏洞是一种在未能获取服务器权限时,利用服务器漏洞,由攻击者构造请求,服务器端发起请求的安全漏洞,攻击者可以利用该漏洞诱使服务器端应用程序向攻击者选择的任意域发出HTTP请求。 很多Web应用都提供了从其他的服务器上…...
Redisson介绍和入门使用
一、什么是Redisson? Redisson是一个在Redis的基础上实现的Java驻内存数据网格(In-Memory Data Grid)。它不仅提供了一系列的分布式的Java常用对象,还提供了许多分布式服务,其中就包含了各种分布式锁的实现。 官网地址…...
TUSB422 MCU 软件用户指南
文章目录 TUSB422 MCU 软件用户指南 目录表格图表1. 介绍2. 配置2.1 通用配置2.2 USB-PD 3.0 支持2.3 VDM 支持 3. 代码 ROM/RAM 大小优化4. 通过 UART 调试4. 移植到其他微控制器 TUSB422 MCU 软件用户指南 摘要 本文档是 TUSB422 微控制器基于 Type-C 端口控制(…...
归并排序 和 七大算法的总结图
目录 什么是递归排序: 图解: 递归方法: 代码实现: 思路分析: 非递归方法: 思路: 代码实现: 思路分析: 什么是递归排序: 先将数据分解成诺干个序列࿰…...
MySQL调用存储过程和存储函数
【图书推荐】《MySQL 9从入门到性能优化(视频教学版)》-CSDN博客 《MySQL 9从入门到性能优化(视频教学版)(数据库技术丛书)》(王英英)【摘要 书评 试读】- 京东图书 (jd.com) MySQL9数据库技术_夏天又到了…...
类与对象(OOP)
类(Class) 类是对象的模板或蓝图,用来描述对象的属性和行为。 动态与静态是同一张图像,最终效果也是相同 类的组成分别由: 属性(成员变量):描述对象的状态。 方法(成员方法):描述对象的行为。 构造函数:用于创建对象…...
接入 SSL 认证配置:满足等保最佳实践
前言 随着信息安全形势的日益严峻,等保(信息安全等级保护)要求成为各行业信息系统必须遵守的标准。在数据库领域,OpenGauss作为一款高性能、安全、可靠的开源关系型数据库,也需要满足等保要求,确保数据的安…...
PyTorch Lightning多GPU分布式日志介绍
分布式日志是指在分布式系统中,多个节点(如多台机器或多个 GPU)协同工作时,对系统运行状态、错误信息、性能指标等进行记录的过程。在 多 GPU/分布式训练 环境下,多个进程会同时运行,普通的 print() 或 logging 可能会在所有 GPU 上重复输出,导致日志混乱。PyTorch Ligh…...
LCR 160. 数据流中的中位数
文章目录 1.题目[LCR 160. 数据流中的中位数](https://leetcode.cn/problems/shu-ju-liu-zhong-de-zhong-wei-shu-lcof/solutions/477593/zi-jie-ti-ku-jian-41-kun-nan-shu-ju-liu-zhong-de-z/)2.思路3.代码 1.题目 LCR 160. 数据流中的中位数 **中位数 **是有序整数列表中的…...
post、get、delete、put请求
一、配置axios拦截器 // src/utils/request.js import axios from axios;// 创建 axios 实例 const instance axios.create({baseURL: https://api.example.com, // 你的 API 基础 URL//timeout: 10000, // 请求超时时间 });// 请求拦截器 instance.interceptors.request.use…...
css: 针对属性left/right/top/bottom为啥设置transition动画不起作用
如题: 在css的position中 left/right/top/bottom 这类位置属性值如果考虑使用transition来添加动画,transition它会优先考虑left/top属性,而此时transition触发需要的是数值型属性,如果设置为auto则系统会默认不考虑将位置属性添加…...
计算机网络(1)基础篇
目录 1.TCP/IP 网络模型 2.键入网址--->网页显示 2.1 生成HTTP数据包 2.2 DNS服务器进行域名与IP转换 2.3 建立TCP连接 2.4 生成IP头部和MAC头部 2.5 网卡、交换机、路由器 3 Linux系统收发网络包 1.TCP/IP 网络模型 首先,为什么要有 TCP/IP 网络模型&a…...