【C语言】18. 自定义类型:结构体类型
文章目录
- 前言:
- 一、结构体类型的声明
- 1、结构体回顾
- 1)结构的声明
- 2)结构体变量的创建和初始化
- 2、结构的特殊声明
- 3、结构的⾃引⽤
- 二、结构体变量的创建和初始化
- 1、对⻬规则
- 2、为什么存在内存对⻬?
- 3、修改默认对⻬数
- 三、结构成员访问操作符
- 1、结构体传参
- 四、结构体内存对⻬
- 1、什么是位段
- 2、位段的内存分配
前言:
其实c语言中有内置类型,也有自定义的类型
内置类型有:
char、short 、int 、long 、 long long、 float、double、long double
但是仅仅有内置类型是不够的,例如人这个复杂对象,无法仅仅通过内置类型就将其描述完整,还需要自定义类型。
c语言中还允许有自定义的类型:
结构体-struct
枚举-enum
联合体-union
一、结构体类型的声明
1、结构体回顾
结构是⼀些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。
1)结构的声明
struct tag//名字自己设置
{member-list;//成员 1个或者多个
}variable-list;//变量列表
struct Book
{char name[20];char author[20];float price;char id[13];//...
}b3,b4;//全局变量struct Book b2;//全局变量int main()
{struct Book b1;//局部变量struct Book arr[5];//数组return 0;
}
例如描述⼀本书:
struct Book
{char name[20];char author[20];float price;char id[13];//...
};int main()
{struct Book b1 = {"西游记","吴承恩",18.8,"PG10001"};//局部变量(按顺序)struct Book b2 = { .id = "PG10001",.author = "吴承恩",.name = "西游记",.price = 18.8 };return 0;
}
2)结构体变量的创建和初始化
#include <stdio.h>struct Stu
{char name[20];//名字 int age; //年龄 char sex[5]; //性别 char id[20]; //学号
};int main()
{//按照结构体成员的顺序初始化 struct Stu s = { "张三", 20, "男", "2023211270" };printf("name: %s\n", s.name);printf("age : %d\n", s.age);printf("sex : %s\n", s.sex);printf("id : %s\n", s.id);//按照指定的顺序初始化 struct Stu s2 = { .age = 21, .name = "thm", .id = "2023211270", .sex = "⼥" };printf("name: %s\n", s2.name);printf("age : %d\n", s2.age);printf("sex : %s\n", s2.sex);printf("id : %s\n", s2.id);return 0;
}
2、结构的特殊声明
在声明结构的时候,可以不完全的声明。
例如:
//匿名结构体:没有名字,这种是一次性的
struct
{char c;int i;double d;
}s={'x',100,3.14};int main()
{printf("%c %d %lf\n", s.c, s.i, s.d);return 0;
}
再⽐如:
//匿名结构体类型
struct
{char c;int i;double d;
}s;struct
{char c;int i;double d;
}* ps;int main()
{ps = &s;//匿名结构体是无法实现的return 0;
}
上⾯的两个结构在声明的时候省略掉了结构体标签tag。
为什么ps=&s无法实现。
警告:
编译器会把上⾯的两个声明当成完全不同的两个类型,所以是⾮法的。
匿名的结构体类型,如果没有对结构体类型重命名的话,基本上只能使⽤⼀次。
那么如何让匿名结构体可以多次使用呢?
typedef struct//匿名结构体重新产生了名字
{char c;int i;double d;
}S;int main()
{S s;return 0;
}
typedef 是 C 语言中的关键字,用于给数据类型定义别名。在这里,它定义了一个匿名结构体。然后紧接着给这个匿名结构体类型赋予了一个新的名字 S
3、结构的⾃引⽤
在结构中包含⼀个类型为该结构本⾝的成员是否可以呢?
⽐如,定义⼀个链表的节点:
struct Node
{int data;struct Node next;
};
上述代码正确吗?如果正确,那 sizeof(struct Node) 是多少?
仔细分析,其实是不⾏的,因为⼀个结构体中再包含⼀个同类型的结构体变量,这样结构体变量的⼤
⼩就会⽆穷的⼤,是不合理的。
正确的⾃引⽤⽅式:
struct Node
{int data;//数据struct Node* next;//指针
};
在结构体⾃引⽤使⽤的过程中,夹杂了 typedef 对匿名结构体类型重命名,也容易引⼊问题,看看
下⾯的代码,可⾏吗?
typedef struct
{int data;Node* next;
}Node;
答案是不⾏的,因为Node是对前⾯的匿名结构体类型的重命名产⽣的,但是在匿名结构体内部提前使
⽤Node类型来创建成员变量,这是不⾏的。
解决⽅案如下:定义结构体不要使⽤匿名结构体了
typedef struct Node
{int data;//数据struct Node* next;//指针
}Node;
二、结构体变量的创建和初始化
我们已经掌握了结构体的基本使⽤了。
现在我们深⼊讨论⼀个问题:计算结构体的⼤⼩。
这也是⼀个特别热⻔的考点: 结构体内存对⻬
1、对⻬规则
⾸先得掌握结构体的对⻬规则:
1.结构体第一个变量置于偏移量为0的地址
2.其他成员变量对齐到对齐数整数倍的地址,对齐数是vs编译器默认的8和自身大小的较小值,linux中gcc没有默认对齐数,对齐数就是成员自身的大小
3.结构体总大小为最大对齐数的整数倍
4.嵌套的结构体对齐到自己成员中最大对齐数的整数倍,最大对齐数要含嵌套结构体中成员的对齐数
struct S1
{char c1;//存储1个字节int i;//4char c2;//1
};struct S2
{char c1;//1char c2;//1int i;//4
};struct S3
{double d;//8char c;//1int i;//4
};struct S4
{char c1;//1struct S3 s3;//16,对齐到成员中最大对齐数也就是8的整数倍位置double d;//8
};int main()
{struct S1 s = { 0 };printf("%zd\n", sizeof(s));//12struct S2 s2 = { 0 };printf("%zd\n", sizeof(s2));//8struct S3 s3 = { 0 };printf("%zd\n", sizeof(s3));//16struct S4 s4 = { 0 };printf("%zd\n", sizeof(s4));//32return 0;
}
c1置为0,占1个字节,i的对齐数是4,置于4整数倍的地址并且占4个字节,c2的对齐数是1,置于i下,占一个字节
0 + c1 + c1 + d + c1
1 + c2 +
2 +
3 +
4 + i + i +
5 + + +
6 + + +
7 + + +
8 + c2 + c + s3
9 - +
10 - +
11 - +
12 + i +
13 + +
14 + +
15 + +
16 +
17 +
18 +
19 +
20 +
21 +
22 +
23 +
24 + d
25 +
26 +
27 +
28 +
29 +
30 +
31 +
32
已经占了9个字节,但是结构体总大小是最大对齐数4的整数倍,所以是12,实际上浪费了6个字节的空间char c1[5]的大小是5个字节
2、为什么存在内存对⻬?
⼤部分的参考资料都是这样说的:
-
平台原因(移植原因):
不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。 -
性能原因:
例如:
struct S
{char c;//1int i;//4 8 struct S s={0};
};
对齐 0 1 2 3 4 5 6 7 8+ + + + +不对齐 0 1 2 3 4 5 6 7 8+ + + + + 按四个字节来,需要读取两次才能得到想要的数据,对齐后只需要访问一次总体来说:结构体的内存对齐是拿空间来换取时间的做法
满足对齐的同时还想要节省空间,只需要让空间小的成员尽量集中在一起
还有个例子:
struct S1
{char c1;int i;char c2;
};struct S2
{char c1;char c2;int i;
};
S1 和 S2 类型的成员⼀模⼀样,但是 S1 和 S2 所占空间的⼤⼩有了⼀些区别。
3、修改默认对⻬数
#pragma 这个预处理指令,可以改变编译器的默认对⻬数。
#pragma pack(1)//设置系统默认对齐数为1
#pragma pack()//还原为默认
#include <stdio.h>
#pragma pack(1)struct S
{char c1;//1 1 1int i;// 4 1 1还是要占4个字节,只是地址变了char c2;//1 1 1
};#pragma pack()int main()
{printf("%zd\n", sizeof(struct S));//6 return 0;
}
结构体在对⻬⽅式不合适的时候,我们可以⾃⼰更改默认对⻬数。
三、结构成员访问操作符
1、结构体传参
struct S
{int arr[1000];//4000字节int n;//4double d;//8
};struct S s = { {1,2,3,4,5},100,3.14 };//结构体传参 void print1(struct S tmp)
{int i = 0;for (i = 0; i < 5; i++){printf("%d ", tmp.arr[i]);}printf("%d ", tmp.n);printf("%lf\n", tmp.d);
}
//要创建一块空间tmp,直接传s,会把s的全部数据传过去,空间时间都会浪费。//结构体地址传参 void print2(const struct S* ps)//const让你更加安全,不会跟着改变
{int i = 0;for (i = 0; i < 5; i++){printf("%d ", ps->arr[i]);}printf("%d ", ps->n);printf("%lf ", ps->d);
}int main()
{print1(s);//传结构体print2(&s);//传地址return 0;
}
上⾯的 print1 和 print2 函数哪个好些?
答案是:⾸选print2函数。
原因:
函数传参的时候,参数是需要压栈,会有时间和空间上的系统开销。
如果传递⼀个结构体对象的时候,结构体过⼤,参数压栈的的系统开销⽐较⼤,所以会导致性能的下降。
结论:
结构体传参的时候,要传结构体的地址。
四、结构体内存对⻬
结构体讲完就得讲讲结构体实现位段的能⼒。
1、什么是位段
struct S
{int _a;//4个字节 _a需要32个bit位 int _b;int _c;int _d;
};0 1 2 3 00 01 10 11 4个字节其实只用得到8个bit位
这个时候我们就需要位段来确定大小以节省空间
位段的声明和结构是类似的,有两个不同:
-
位段的成员必须是 int、unsigned int 或signed int ,在C99中位段成员的类型也可以
选择其他类型。 -
位段的成员名后边有⼀个冒号和⼀个数字。
⽐如:
struct S
{int _a : 2;//_a只占2个bit位int _b : 5;//占5个bit位int _c : 10;//占10个bit位int _d : 30;//占30个bit位
};
S就是⼀个位段类型。
那位段S所占内存的⼤⼩是多少?
2+5+10+30=47 6*8=48 理论上总共只需要6个字节,打印出来是8个,也比16个少
printf("%d\n", sizeof(struct S));
2、位段的内存分配
-
位段的成员可以是 int unsigned int signed int 或者是 char 等类型
-
位段的空间上是按照需要以4个字节( int )或者1个字节( char )的⽅式来开辟的。
-
位段涉及很多不确定因素,位段是不跨平台的,注重可移植的程序应该避免使⽤位段。
struct S
{char a : 3;//前面是char,说明是一次开辟8个bit位char b : 4;char c : 5;char d : 4;
};int main()
{struct S s = { 0 };s.a = 10;s.b = 12;s.c = 3;s.c = 4;printf("%zd\n", sizeof(s));//3个字节return 0;
}
解析:
申请空间;b a c d ----+++ +++++ ++++
00000000 00000000 00000000 下面是8个bit位
1.申请到的一块内存中,从左往右使用,还是从右往左使用,是不确定的 vs中是从右往左
2.剩余的空间,不足下一个成员使用的时候,是浪费呢?还是继续使用? vs中是浪费赋值后:
10:00001010 3个bit位就是a 010
12: 00001100 b 1100
3 :00000011 c 00011
4: 00000100 d 0100b a c d 1100010 00011 0100----+++ +++++ ++++
00000000 00000000 00000000 补全后:
01100010 00000011 00000100
0110 0010 0000 0011 0000 01006 2 0 3 0 4 -->0x:16进制
struct S
{int _a:2;//前面是int,说明一下要开辟32个bit位int _b:5;int _c : 10;int _d : 30;
};c b a
000000000000000 0000000000 00000 00 前面不够要在往后边开辟32个bit位放d,所以总共需要64个bit位,8个字节
位段使用的注意事项:
1个字节是有地址的,1个bit位是没有地址的
所以不能对位段的成员使用&操作符,这样就不能使用scanf直接给位段成员输入值,只能先输入再一个变量中,再赋值给位段的成员
struct A
{int _a : 2;int _b : 5;int _c : 10;int _d : 30;
};int main()
{//struct A sa = { 0 };//scanf("%d", &(sa._b));//这是错误的int b = 0;//这是正确的scanf("%d", &b);sa._b = b;//b赋值给位段成员return 0;
}
相关文章:
【C语言】18. 自定义类型:结构体类型
文章目录 前言:一、结构体类型的声明1、结构体回顾1)结构的声明2)结构体变量的创建和初始化 2、结构的特殊声明3、结构的⾃引⽤ 二、结构体变量的创建和初始化1、对⻬规则2、为什么存在内存对⻬?3、修改默认对⻬数 三、结构成员访问操作符1、…...
智能租赁管理系统助力规范化住房租赁市场提升用户体验
内容概要 在当今的住房租赁市场中,智能租赁管理系统应运而生,为房东和租客带来了前所未有的便利。这套系统就像一位全能助手,将租赁信息、监管机制以及在线签约功能集成在一起,让整个过程变得流畅而高效。换句话说,您…...
ERROR: KeeperErrorCode = NoNode for /hbase/master
原因分析 通过上面的情景模拟,我们可以看到报错的原因在于zookeeper中出现问题,可能是zookeeper中的/hbase/master被删除,或者是在hbase集群启动之后重新安装了zookeeper,导致zookeeper中的/hbase/master节点数据异常。 1. 停止…...
springboot第84集:Java进阶之路, Netty
# kafka-map文件夹 cd /usr/local/kafka-map # 根据需求自行修改配置 vi application.yml # 启动 java -jar kafka-map.jar byte minByte -128; byte maxByte 127; 用于表示一个 8 位(1 字节)有符号整数。它的值范围是 -128(-2^7࿰…...
DevOps持续集成
DevOps流程 第一步安装git 关闭防火墙 systemctl stop firewalld cd /usr/loacl vim docker-compose.yml docker search gitlab 拉取gitlab镜像 2.33GB docker pull gitlab/gitlab-ce:latestvim docker-compose.yml修改docker-compose.yml version: 3.1 services:gitlab:i…...
sql server log文件
确定 SQL Server 实例中具有大量 VDF 的数据库 SELECT [name], COUNT(l.database_id) AS vlf_count FROM sys.databases AS s CROSS APPLY sys.dm_db_log_info(s.database_id) AS l GROUP BY [name] HAVING COUNT(l.database_id) > 100; 在收缩日志文件之前确定事务日志中…...
pip install报错 Missing dependencies for SOCKS support的正确解决办法:离线安装pysocks
今天准备开发python项目的时候,发现在pip install 的时候报错了,提示:Missing dependencies for SOCKS support,查遍csdn所有的回答都统一是只需要执行: unset all_proxy unset ALL_PROXY 然后再执行 pip install p…...
嵌入式学习(15)-stm32通用GPIO模拟串口发送数据
一、概述 在项目开发中可能会遇到串口不够用的情况这时候可以用通过GPIO来模拟串口的通信方式。 二、协议格式 按照1位起始位8位数据位1位停止位的方式去编写发送端的程序。起始位拉低一个波特率的时间;发送8位数据;拉高一个波特率的时间。 三、代码 …...
AKE 安全模型:CK, CK+, eCK
参考文献: [BCK98] Mihir Bellare, Ran Canetti, Hugo Krawczyk. A Modular Approach to the Design and Analysis of Authentication and Key Exchange Protocols (Extended Abstract). STOC 1998: 419-428.[CK01] Ran Canetti, Hugo Krawczyk. Analysis of Key-E…...
【Linux】通过crond服务设置定时执行shell脚本,实际执行时间却延迟了8小时
一、问题描述 通过使用crond服务设置定时任务,在每天凌晨的2:00执行脚本,但检查结果时发现,实际执行时间却在上午10点。 检查shell脚本执行结果发现,实际执行脚本时间在上午10:00,延迟了8小时。 检查系统时间…...
什么是云原生数据库 PolarDB?
云原生数据库 PolarDB 是阿里云推出的一款高性能、兼容性强、弹性灵活的关系型数据库产品。它基于云原生架构设计,结合分布式存储和计算分离的技术优势,为用户提供强大的计算能力、卓越的可靠性以及高性价比的数据库解决方案。PolarDB 适合各种业务场景&…...
(6)JS-Clipper2之ClipperOffset
1. 描述 ClipperOffset类封装了对打开路径和关闭路径进行偏移(膨胀/收缩)的过程。 这个类取代了现在已弃用的OffsetPaths函数,该函数不太灵活。可以使用不同的偏移量(增量)多次调用Execute方法,而不必重新分配路径。现在可以在一次操作中对开放和封闭路…...
基于51单片机64位病床呼叫系统设计( proteus仿真+程序+设计报告+原理图+讲解视频)
基于51单片机病床呼叫系统设计( proteus仿真程序设计报告原理图讲解视频) 仿真图proteus7.8及以上 程序编译器:keil 4/keil 5 编程语言:C语言 设计编号:S0095 1. 主要功能: 基于51单片机的病床呼叫系统proteus仿…...
工业智能网关如何为企业实现智能制造赋能?
在数字化转型的浪潮中,工业智能网关作为连接物理世界与数字世界的桥梁,正逐步成为智能制造领域的核心组件。本文将通过一个实际使用案例,深入剖析工业智能网关如何助力企业实现生产流程的优化、数据的高效采集与分析,以及智能化决…...
【Spring项目】表白墙,留言板项目的实现
阿华代码,不是逆风,就是我疯 你们的点赞收藏是我前进最大的动力!! 希望本文内容能够帮助到你!! 目录 一:项目实现准备 1:需求 2:准备工作 (1)…...
Java-WebSocket
文章目录 WebSocket概念SpringBoot实现一个WebSocket示例STOMP消息订阅和发布后端主动发送消息 跨域 WebSocket概念 应用层协议,底层采用TCP,特点:持续连接,有状态,双向通信 当客户端想要与服务器建立WebSocket连接时…...
C#请求https提示未能为 SSL/TLS 安全通道建立信任关系
System.Net.WebException: 基础连接已经关闭: 未能为 SSL/TLS 安全通道建立信任关系 ,这个错误通常表明你的应用程序在尝试建立一个安全的 SSL/TLS 连接时遇到了问题。这通常是由于证书验证失败引起的。证书验证失败可能有几个原因: 证书不受信任&#…...
pdf转word/markdown等格式——MinerU的部署:2024最新的智能数据提取工具
一、简介 MinerU是开源、高质量的数据提取工具,支持多源数据、深度挖掘、自定义规则、快速提取等。含数据采集、处理、存储模块及用户界面,适用于学术、商业、金融、法律等多领域,提高数据获取效率。一站式、开源、高质量的数据提取工具&…...
人工智能与机器学习:真实案例分析及其在各行业的应用前景
目录 引言 人工智能与机器学习的基础概念 人工智能的历史与演变 机器学习的算法分类 深度学习与传统机器学习的区别 行业应用案例分析 医疗健康 疾病预测与诊断 影像识别的运用 案例:IBM Watson在肿瘤治疗中的应用 金融服务 风险评估与欺诈检测 投资预测…...
再谈多重签名与 MPC
目录 什么是 MPC 钱包以及它们是如何出现的 多重签名和智能合约钱包已经成熟 超越 MPC 钱包 关于小队 多重签名已经成为加密货币领域的一部分,但近年来,随着 MPC(多方计算)钱包的出现,多重签名似乎被掩盖了。MPC 钱包之…...
(长期更新)《零基础入门 ArcGIS(ArcMap) 》实验二----网络分析(超超超详细!!!)
相信实验一大家已经完成了,对Arcgis已进一步熟悉了,现在开启第二个实验 ArcMap实验--网络分析 目录 ArcMap实验--网络分析 1.1 网络分析介绍 1.2 实验内容及目的 1.2.1 实验内容 1.2.2 实验目的 2.2 实验方案 2.3 实验流程 2.3.1 实验准备 2.3.2 空间校正…...
Python、R循环神经网络RNN、指数平滑ETS、ARIMA模型预测网络流量、ATM机取款、旅游需求时间序列数据...
全文链接:https://tecdat.cn/?p38496 分析师:Pengyuan Wen 在当今经济研究与商业决策领域,精准的时间序列预测具有极为关键的意义。社会消费品零售总额作为反映人民消费水平以及国民经济状况的核心指标,其发展趋势的精准把握对中…...
通过PS和Unity制作2D动画之二:IK的使用
一、IK的概念 IK:Inverse Kinematics,反向动力学。 (1)正向动力学 在骨骼动画中,构建骨骼的方法被称为正向动力学。它的表现形式是:子骨骼(关节)的位置根据父骨骼(关节…...
如何防御ARP欺骗 保护IP安全
在数字化浪潮席卷全球的今天,网络安全威胁如同暗流涌动,时刻考验着我们的防范能力。其中,ARP欺骗攻击作为一种隐蔽性强、成本低廉且危害严重的网络攻击手段,成为众多网络安全事件中的一颗“毒瘤”。那么我们究竟是如何防御ARP欺骗…...
浏览器插件上架流程
上回说到,用 AI 开发上架了个浏览器插件。有朋友想知道上架扩展有需要哪些步骤。这里做个整理,这篇文章结构和步骤都是 AI 整理的。里面的文案细节、推荐的工具是我自己总结,以前发布扩展时直接用的。有需要的话下面的文案可以直接拷贝使用。…...
Android13 USB 串口默认授权
一)场景需求 项目中使用到了can协议控制车机功能,can 直接转串口,用USB转串口工具 cn.wch.uartlib 来实现. can 板子通过usb 插入到机器上面,那就是usb 协议了。 遇到问题: 插入can 板的usb 到机器上后,直…...
word实践:正文/标题/表图等的共用模板样式设置
说在前面 最近使用word新建文件很多,发现要给大毛病,每次新建一个word文件,标题/正文的字体、大小和间距都要重新设置一遍,而且每次设置这些样式都忘记了参数,今天记录一下,以便后续方便查看使用。现在就以…...
docker安装kettle(PDI)并实现web访问
我是MAC电脑M1版本,希望把软件交给docker进行管理,最近公司同事都通过kettle来实现外部数据对接,所以我本地也有安装kettle需求,在网上找到了这个解决方案操作很简单,但出现了无法访问的情况。我的排查方式是ÿ…...
vue自定义弹窗点击除了自己区域外关闭弹窗
这里使用到vue的自定义指令 <div class"item" v-clickoutside"clickoutside1"><div click"opencity" class"text":style"{ color: popup.iscitypop || okcitylist.length ! 0 ? #FF9500 : #000000 }">选择地区…...
【vue2】封装自定义的日历组件(三)之基础添加月份的加减定位到最新月份的第一天
我们在切换月份的时候,希望高亮显示在每个月的第一天上面,这样的效果我们要怎么来实现,其实也很简单,我们先看下实现的效果 实现效果 代码实现 原理就是获取到每月的第一天日期,然后再跟整个的数据进行对比ÿ…...
21天掌握javaweb-->第12天:Spring Boot项目优化与安全性
Spring Boot项目优化与安全性 1. Spring Boot性能优化 1.1 减少依赖项 评估项目的依赖项,并确保只引入必要的依赖。较多的依赖项可能会增加启动时间,因为它们需要被扫描和初始化。通过删除不需要的依赖项或仅引入必要的模块,可以减少类路径…...
Android —— 四大组件之Activity(一)
Android四大组件即Activity(前台)Service(后台),Broadcast(通信),ContentProvider(数据存储) 一、Activity Activity 充当了应用与用户互动的入口点Activity …...
Ubuntu手持司岚S2激光雷达进行建图
目前通过ros包将激光雷达数据读取之后: roslaunch rplidar_ros view_rplidar_s2.launch 再通过运行 cartographer_ros结点将代码运行起来 roslaunch cartographer_ros demo_revo_lds.launch 这里要注意, 在demo_revo_lds.launch 文件中引入的revo_lds.lua文件中要使用仿真时…...
快速了解 Aurora DSQL
上周在 AWS re:Invent大会(类似于阿里云的云栖大会)上推出了新的产品 Aurora DSQL[1] ,在数据库层面提供了多区域、多点一致性写入的能力,兼容 PostgreSQL。并声称,在多语句跨区域的场景下,延迟只有Google …...
【Android Studio】学习——网络连接
实验:Android网络连接 文章目录 实验:Android网络连接[toc]实验目标和实验内容:1、掌握Android联网的基本概念;2、能够使用URL connection实现网络连接;3、掌握第三方库的基本概念4、需实现的具体功能 实验结果功能说明…...
c语言复制字符串memcpy和strncpy函数区别
memcpy 和 strncpy 的耗时区别 这两个函数在功能上有明显差异,导致性能和耗时也不同。以下是它们的详细对比: 1. 功能差异 函数功能memcpy按字节复制数据,不处理字符串终止符 \0,适用于任意数据类型的内存复制。strncpy复制字符…...
Java设计模式 —— 【创建型模式】建造者模式详解
文章目录 一、建造者模式二、案例实现三、优缺点四、模式拓展五、对比1、工厂方法模式VS建造者模式2、抽象工厂模式VS建造者模式 一、建造者模式 建造者模式(Builder Pattern) 又叫生成器模式,是一种对象构建模式。它可以将复杂对象的建造过…...
python爬虫--某房源网站验证码破解
文章目录 使用模块爬取目标验证码技术细节实现成果代码实现使用模块 requests请求模块 lxml数据解析模块 ddddocr光学识别 爬取目标 网站验证码破解思路是统一的,本文以城市列表为例 目标获取城市名以及城市连接,之后获取城市房源信息技术直接替换地址即可 验证码 技术…...
Android 项目依赖库无法找到的解决方案
目录 错误信息解析 解决方案 1. 检查依赖版本 2. 检查 Maven 仓库配置 3. 强制刷新 Gradle 缓存 4. 检查网络连接 5. 手动下载依赖 总结 相关推荐 最近,我在编译一个 Android 老项目时遇到了一个问题,错误信息显示无法找到 com.gyf.immersionba…...
SpringBoot3整合SpringMVC
一、实现过程: (1).创建程序 (2).引入依赖: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"…...
内网穿透 natapp安装与使用
前言 NATAPP是一款基于ngrok的内网穿透工具。以下是对NATAPP的详细概述: 基本概念 定义:内网穿透(NAT穿透)是一种技术,它允许具有特定源IP地址和端口号的数据包能够绕过NAT设备,从而被正确地路由到内网主机…...
docker镜像构建企业级示例
华子目录 示例(在centos容器中源码编译nginx(单介构建))包准备为centos容器提供网络源添加企业7的ISO文件 提交为新的centos镜像编写dockerfile文件构建镜像如何优化自己构建的镜像大小多介构建 ldd命令基本用法示例 镜像优化方案…...
【论文阅读】龙芯2号处理器设计和性能分析
作者:胡伟武老师 胡伟武老师是计算机体系结构方向的大牛,推动了龙芯处理器的发展 学习体会: 学习追踪龙芯系列“工程流”论文,看看如何做工程,完成→完美 龙芯2号处理器几乎是工程向的论文,主要看一下实现…...
二一(GIT4)、echarts(地图)、黑马就业数据平台(学生页-增 删 改)
1. echarts 地图 echarts社区:makeapie echarts社区图表可视化案例 社区模板代码地址:自定义 tooltip-轮播 - category-work,series-map地图,tooltip提示框,visualMap视觉映射 - makeapie echarts社区图表可视化案例 // todo: 籍贯分布 地图 function…...
数据结构排序算法详解
数据结构排序算法详解 1、冒泡排序(Bubble Sort)2、选择排序(Selection Sort)2、插入排序(Insertion Sort)4、快速排序(Quick Sort) 1、冒泡排序(Bubble Sort)…...
使用kubeadm命令安装k8s
版本信息 kubernetesVersion: 1.28.01. 前期环境准备 先配置软件源可以安装kubeadm、kubelet、kubectl三个软件,不同的系统不同的安装方式,这里不列举了,自己找。然后要安装cri-dockerd,因为kubernetes从1.24版本不再支持docker的api,支持原生的containerd的api,可以使用…...
依托 Spring Boot框架,精铸高扩展性招聘信息管控系统
1 绪 论 1.1 课题背景与意义 在Internet高速发展的今天,计算机的应用几乎完全覆盖我们生活的各个领域,互联网在经济,生活等方面有着举足轻重的地位,成为人们资源共享,信息快速传递的重要渠道。在中国,网上管…...
docker 部署 mysql 9.0.1
docker 如何部署 mysql 9 ,请看下面步骤: 1. 先看 mysql 官网 先点进去 8 版本的 Reference Manual 。 选择 9.0 版本的。 点到这里来看, 这里有一些基础的安装步骤,可以看一下。 - Basic Steps for MySQL Server Deployment wit…...
SQL:从某行开始,查询一定行数的语句
比如实现从第五行开始查询5行数据的SQL语句 不同数据库有不同的实现方式,下面是各大数据库的查询语句。 1. SQL Server(适用于 SQL Server 2012 及之后版本)、DB2、Oracle(适用12c及以上版本) 这几种数据库的实现方式…...
18. 模块
一、什么是模块 模块化 指将一个完成的程序分解为一个一个小的模块。通过将模块组合,来搭建一个完整的程序。如果不采用模块化,那么所有的代码将统一保存到一个文件中。采用模块化后,将程序分别编写到多个文件中。使用模块化后,我…...