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

C语言超详细结构体知识

1.自定义类型:结构体的介绍

在之前的博客中,我们简单介绍过了关于结构体的基本知识,这里我们稍微复习一下。

结构体(struct)是C语言中一种重要的复合数据类型,它允许将不同类型的数据组合成一个整体。


1.1结构体的定义

结构体使用struct关键字定义,基本语法:

struct 结构体名 {数据类型 成员1;数据类型 成员2;// ...
};

 例如描述一个学生:

struct Stu {char name[20];int age;char sex[10];
};

1.2结构体的声明和初始化

struct Student {int id;char name[20];float score;
};// 方式1: 先定义结构体类型,再声明变量
struct Student stu1;// 方式2: 定义结构体类型的同时声明变量
struct Student {int id;char name[20];float score;
} stu2, stu3;// 方式3: 使用typedef创建别名
typedef struct {int id;char name[20];float score;
} Student;
Student stu4;//方法4:特殊声明,在声明结构体的时候,可以不完全声明
struct {int id;char name[20];float score;
}stu5;struct {int id;char name[20];float score;
}* stu6;stu6 = &stu5;

上述前三种声明都没有什么问题,而第四种声明我们要格外注意,我们在声明里省略了结构体标签,那么stu6 = &stu5这个代码能否能够正确运行呢?我们测试一下:

我们可以看到编译器报错了,编译器会把上面两个声明当成完全不同的类型。 

初始化结构体变量的方法一般有两种,如下:

struct Student {int id;char name[20];float score;
};//按定义顺序初始化
struct Student stu1 = { 20253265,"zhangsan",58.8 };//指定成员初始化
struct Student stu1 = { .id = 20251653,.name = "lisi",.score = 78.8 };

1.3结构体成员的访问

1.使用点运算符 访问结构体成员:

struct Student {int id;char name[20];float score;
};int main()
{struct Student stu1 = { 20253265,"zhangsan",58.8 };printf("%d\n", stu1.id);printf("%s\n", stu1.name);printf("%f\n", stu1.score);return 0;
}

 2.对于结构体指针,使用箭头运算符 ->访问成员:

struct Student {int id;char name[20];float score;
};int main()
{struct Student stu1 = { 20253265,"zhangsan",58.8 };struct Student* ps = &stu1;printf("%d\n", ps->id);printf("%s\n", ps->name);printf("%d\n", ps->score);return 0;
}

2. 结构体内存对齐

2.1对齐规则

学习上文已经使我们掌握了结构体的基本使用,现在我们要来深入探讨一个问题:计算结构体的大小。我们先来看一段代码:

struct S1 {char c1;char c2;int i;
};struct S2 {char c1;int i;char c2;
};int main()
{printf("%zd\n", sizeof(struct S1));printf("%zd\n", sizeof(struct S2));return 0;
}

大家可以猜一下这段代码的结果,会打印6,6吗,我们运行看结果:

 我们看到结果打印和我们预料结果完全不同,这是否说明在结构体中内存分配和正常内存分配有很大差异呢?答案是肯定的,我们先来学习结构体内存分配规则:对齐规则。

对齐规则:

1. 结构体的第一个成员对齐到和结构体变量起始位置偏移量为0的地址处

2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。

    对齐数 = 编译器默认的⼀个对齐数 与 该成员变量大小的较小值。

    - VS 中默认的值为 8

    - Linux中 gcc 没有默认对齐数,对齐数就是成员自身的大小

3. 结构体总大小为最大对齐数(结构体中每个成员变量都有⼀个对齐数,所有对齐数中最大的)的整数倍。

4. 如果嵌套了结构体的情况,嵌套的结构体成员对齐到自己的成员中最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体中成员的对齐数)的整数倍。

S1结构体的第一个变量c1对齐到和结构体变量起始位置偏移量为0的地址处,对应0字节空间,第二个成员变量为c2,对齐数为1(字符类型变量大小为1)和8(vs2022默认对齐数为8)的最小值,其实位置要对齐1的整数倍,对应1字节空间,第三个成员变量为i,对齐数为4(整型类型变量大小为4)和8(vs2022默认对齐数为8)的最小值,起始位置要对齐4的整数倍,对应4~7的字节空间。结构体总大小是最大对齐数的整数倍,S1结构体最大对齐数是4,要存入三个成员变量,至少需要8个字节,所以该结构体总大小为8个字节。如上图所示。

S2结构体的第一个变量c1对齐到和结构体变量起始位置偏移量为0的地址处,对应0字节空间,第二个成员变量为i,对齐数为4(整型类型变量大小为4)和8(vs2022默认对齐数为8)的最小值,起始位置要对齐4的整数倍,对应4~7字节空间,第三个成员变量为c2,对齐数为1(字符类型变量大小为4)和8(vs2022默认对齐数为8)的最小值,起始位置要对齐1的整数倍,对应8的字节空间。结构体总大小是最大对齐数的整数倍,S1结构体最大对齐数是4,要存入三个成员变量,至少需要9个字节,所以该结构体总大小为12个字节。如上图所示。

 解决了上述两个问题,我们在看一个存在结构体嵌套求解结构体内存大小的问题。

 S3结构体的第一个变量c1对齐到和结构体变量起始位置偏移量为0的地址处,对应0字节空间,第二个成员变量为s2,嵌套的结构体成员对齐到自己的成员中最大对齐数的整数倍处,对齐数为4,起始位置要对齐4的整数倍,对应4~15字节空间,第三个成员变量为d,对齐数为8(双精度浮点数类型变量大小为8)和8(vs2022默认对齐数为8)的最小值,起始位置要对齐8的整数倍,对应16~23的字节空间。结构体总大小是最大对齐数的整数倍,S3结构体最大对齐数是8,要存入三个成员变量,至少需要24个字节,所以该结构体总大小为24个字节。如上图所示。

其实我们在划分内存的时候,有些内存空间会被我们浪费掉,可不可以避免掉呢,其实是可以避免一部分的,在接下来的学习中我回讲到。

上述三体都是根据对齐规则求出来的,大家要好好掌握。


2.2为什么回存在内存对齐

1. 平台原因 (移植原因):
不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。
2. 性能原因:
数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。假设一个处理器总是从内存中取8个字节,则地址必须是8的倍数。如果我们能保证将所有的double类型的数据的地址都对齐成8的倍数,那么就可以用个内存操作来读或者写值了。否则,我们可能需要执行两次内存访问,因为对象可能被分放在两个8字节内存块中。
总体来说:结构体的内存对齐是拿空间来换取时间的做法。

 那在设计结构体的时候,我们既要满足对齐,又要节省空间,如何做到:

//例如:
struct S1//8
{char c1;int i;char c2;
};struct S2//12
{char c1;char c2;int i;
};

 S1 S2 类型的成员⼀模⼀样,但我们让占有空间小的成员集中在一起,可以让结构体所占空间大小变小一点。


 2.3修改默认对齐数

#pragma这个预处理指令,可以改变编译器的默认对齐数。

 可以看到我们将默认对齐数改为1,结构体所占内存空间变为了6个字节,减少了很大一部分空间。

结构体在对齐方式不合适的时候,我们可以自己更改默认对齐数。


 3.结构体传参

struct S
{int data[1000];int num;
};struct S s = { {1,2,3,4}, 1000 };//结构体传参
void print1(struct S s)
{printf("%d\n", s.num);
}//结构体地址传参
void print2(struct S* ps)
{printf("%d\n", ps->num);
}int main()
{print1(s); //传结构体print2(&s); //传地址return 0;
}

上面的print1和print2函数那个好一些?首选print2函数。

 原因:

函数传参的时候,参数是需要压栈,会有时间和空间上的系统开销。如果传递⼀个结构体对象的时候,结构体过⼤,参数压栈的的系统开销⽐较⼤,所以会导致性能的下 降。
结构体传参的时候,要传结构体的地址。

4.结构体实现位段

4.1什么是位段

位段的声明和结构式类似的,有两个不同:

1. 位段的成员必须是 int unsigned int signed int ,在C99中位段成员的类型也可以
选择其他类型。
2. 位段的成员名后边有⼀个冒号和⼀个数字。

比如:

struct A
{int _a : 2;//代表该变量在内存空间中仅占2个bit位int _b : 5;//代表该变量在内存空间中仅占5个bit位int _c : 10;//代表该变量在内存空间中仅占10个bit位int _d : 30;//代表该变量在内存空间中仅占30个bit位
};

这就是一个典型的位段示例。它可以控制成员在内存中所占bit位的个数,那么他总共占的内存空间有多大呢?

位段的内存分配规则很大一部分取决于编译器,以作者所用的vs2022环境下举例,看以下代码:

struct S
{char a : 3;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.d = 4;return 0;
}

从调试结果看,所占空间为3个字节。我们来分析过程:

a = 10,二进制为01010,而结构体位段规定a中只能存放3个bit位的数据,所以存010

b = 10,二进制为01100,而结构体位段规定a中只能存放4个bit位的数据,所以存1100

c = 10,二进制为00011,而结构体位段规定a中只能存放5个bit位的数据,所以存00011

a = 10,二进制为00100,而结构体位段规定a中只能存放4个bit位的数据,所以存0100

知道它们在内存中存的是什么之后,我们还有一个问题,它们是按什么顺序,什么规则存进去呢? 在vs2022环境下,在一个字节中,他要从高地址往低地址存放,第一个字节8个bit位存01100010,最高位之所以是0,是因为下一个数据占5个bit位的内存,1个bit位存不下,所以只能存放至下一个字节中(下同),第二个字节存00000011,第三个字节存00000100,最后在调试结果下从低地址到高地址分别为:0x62,0x03,0x04。

4.2位段的跨平台问题

1.int 位段被当成有符号数还是无符号数是不确定的。不能确定最高位是否为符号位。

2.位段中最大位的数目不能确定。(16位机器最⼤16,32位机器最⼤32,写成27,在16位机器会出问题。)

3.位段中的成员在内存中从左向右分配,还是从右向左分配标准尚未定义。(vs2022环境下,从右向左,也就是从高地址向低地址存)

4.当一个结构包含两个位段,第二个位段成员比较大,无法容纳于第一个位段剩余的位时,是舍弃剩余的位还是利用,这是不确定的。(vs2022环境下,舍弃)

跟结构相⽐,位段可以达到同样的效果,并且可以很好的节省空间,但是有跨平台的问题存在。

4.3位段的应用 

下图是网络协议中,IP数据报的格式,我们可以看到其中很多的属性只需要几个bit位就能描述,这里使用位段,能够实现想要的效果,也节省了空间,这样⽹络传输的数据报大小也会较小⼀些,对网络的畅通是有帮助的。

4.4位段使用的注意事项

位段的⼏个成员共有同⼀个字节,这样有些成员的起始位置并不是某个字节的起始位置,那么这些位置处是没有地址的。内存中每个字节分配⼀个地址,⼀个字节内部的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;return 0;
}

相关文章:

C语言超详细结构体知识

1.自定义类型:结构体的介绍 在之前的博客中,我们简单介绍过了关于结构体的基本知识,这里我们稍微复习一下。 结构体(struct)是C语言中一种重要的复合数据类型,它允许将不同类型的数据组合成一个整体。 1.1结构体的定义 结构体使…...

2N60-ASEMI功业控制与自动化专用2N60

编辑:ll 2N60-ASEMI功业控制与自动化专用2N60 型号:2N60 品牌:ASEMI 封装:TO-220F 批号:最新 最大漏源电流:2A 漏源击穿电压:600V RDS(ON)Max:5.00Ω…...

发现“横”字手写有难度,对比两个“横”字

我发现手写体“横”字“好看”程度&#xff0c;难以比得上印刷体&#xff1a; 两个从方正简体启体来的“横”字&#xff1a; 哪个更好看&#xff1f;我是倾向于左边一点。 <div style"transform: rotate(180deg); display: inline-block;"> 左边是我从方正简…...

深入解析 HTML5 Web IndexedDB 数据库:构建高效离线应用的基石

摘要 在现代 Web 应用开发中,离线访问和高效处理大量结构化数据的需求日益增长。HTML5 的 IndexedDB 作为一种强大的客户端 NoSQL 数据库,为开发者提供了可靠的解决方案。本文将全面介绍 IndexedDB 的特性、语法、方法、应用实例、使用场景,以及其优势与劣势,帮助开发者深…...

17-算法打卡-哈希表-快乐数-leetcode(202)-第十七天

1 题目地址 202. 快乐数 - 力扣&#xff08;LeetCode&#xff09;202. 快乐数 - 编写一个算法来判断一个数 n 是不是快乐数。「快乐数」 定义为&#xff1a; * 对于一个正整数&#xff0c;每一次将该数替换为它每个位置上的数字的平方和。 * 然后重复这个过程直到这个数变为 1…...

决战浏览器渲染:减少重绘(Repaint)与重排(Reflow)的性能优化策略

在现代Web开发中&#xff0c;流畅的用户体验是衡量应用质量的关键指标之一。用户与界面的每一次交互&#xff0c;背后都牵动着浏览器复杂而精密的渲染过程。当这个过程不够高效时&#xff0c;用户就会感受到卡顿、延迟&#xff0c;甚至页面“掉帧”。在众多影响渲染性能的因素中…...

深度解析生成对抗网络:原理、应用与未来趋势

在人工智能的浩瀚星空中&#xff0c;生成对抗网络&#xff08;Generative Adversarial Networks&#xff0c;GAN&#xff09;犹如一颗璀璨的明星&#xff0c;自 2014 年由 Ian Goodfellow 等人提出以来&#xff0c;便以其独特而强大的生成能力&#xff0c;在计算机视觉、自然语…...

电能质量治理解决方案:构建高效、安全的电力系统

随着“双碳”目标的推进及新型电力系统的快速发展&#xff0c;大量电力电子设备&#xff08;如光伏逆变器、充电桩、变频器等&#xff09;接入电网&#xff0c;导致谐波畸变、无功功率激增、电压波动等问题日益突出。电能质量恶化不仅威胁设备安全&#xff0c;还影响电网稳定运…...

生态篇|多总线融合与网关设计

引言 1. 车内多总线概览 2. 主流车载总线技术对比 3. 网关设计原则与架构 4. 协议转换与映射策略 5. 安全与诊断功能集成...

热门与冷门并存,25西电—电子工程学院(考研录取情况)

1、电子工程学院各个方向 2、电子工程学院近三年复试分数线对比 学长、学姐分析 由表可看出&#xff1a; 1、电子科学与技术25年相较于24年上升20分 2、信息与通信工程、控制科学与工程、新一代电子信息技术&#xff08;专硕&#xff09;25年相较于24年下降25分 3、25vs24推…...

HDFS入门】HDFS安全与权限管理解析:从认证到加密的完整指南

目录 引言 1 认证与授权机制 1.1 Kerberos认证集成 1.2 HDFS ACL细粒度控制 2 数据加密保护 2.1 传输层加密(SSL/TLS) 2.2 静态数据加密 3 审计与监控体系 3.1 操作审计流程 3.2 安全监控指标 4 权限模型详解 4.1 用户/组权限模型 4.2 umask配置原理 5 安全最佳实…...

合成数据中的对抗样本生成与应用:让AI模型更强、更稳、更安全

目录 合成数据中的对抗样本生成与应用&#xff1a;让AI模型更强、更稳、更安全 一、什么是对抗样本&#xff1f; 二、为什么要在合成数据中引入对抗样本&#xff1f; 三、对抗样本在图像合成数据中的生成方法 ✅ 方法1&#xff1a;FGSM&#xff08;Fast Gradient Sign Met…...

考研系列-计算机网络-第二章、物理层

一、通信基础 1.物理层基本概念 2.数据通信基础知识...

uni-app 安卓10以上上传原图解决方案

在Android 10及以上版本中&#xff0c;由于系统对文件访问的限制&#xff0c;使用chooseImage并勾选原图上传后&#xff0c;返回的是图片的外部存储路径&#xff0c;如&#xff1a;file:///storage/emulated/0/DCIM/Camera/。这种外部存储路径&#xff0c;无法直接转换成所需要…...

关于element的dialog的取消(关闭弹窗)方法触发两次

在这里插入图片描述 关闭的时候加个修饰符.native close.native...

vue,uniapp解决h5跨域问题

如果有这样的跨域问题&#xff0c;解决办法&#xff1a; ✅ 第一步&#xff1a;在项目根目录下创建 vue.config.js 和 package.json 同级目录。 // vue.config.js module.exports {devServer: {proxy: {/api: {target: https://app.yycjkb.cn, // 你的后端接口地址changeOrig…...

2025-04-18 李沐深度学习3 —— 线性代数

文章目录 1 线性代数1.1 标量、向量与矩阵1.2 矩阵概念1.3 按特定轴求和 2 实战&#xff1a;线性代数2.1 标量2.2 向量2.3 矩阵2.4 张量2.5 降维2.6 点积2.7 矩阵-向量积2.8 矩阵-矩阵乘法2.9 范数2.10 练习 1 线性代数 1.1 标量、向量与矩阵 标量&#xff08;Scalar&#xff…...

2026《数据结构》考研复习笔记三(C++高级教程)

C高级教程 一、文件和流二、异常处理三、命名空间四、模板五、信号处理六、多线程 一、文件和流 iostream 用于标准输入/输出&#xff08;控制台I/O&#xff09;&#xff0c;处理与终端&#xff08;键盘输入和屏幕输出&#xff09;的交互 包含以下全局流对象&#xff1a; cin&…...

python进阶: 深入了解调试利器 Pdb

Python是一种广泛使用的编程语言&#xff0c;以其简洁和可读性著称。在开发和调试过程中&#xff0c;遇到错误和问题是不可避免的。Python为此提供了一个强大的调试工具——Pdb&#xff08;Python Debugger&#xff09;。 Pdb是Python标准库中自带的调试器&#xff0c;可以帮助…...

前端资源加载失败后重试加载(CSS,JS等引用资源)

前端资源加载失败后的重试 .前端引用资源时出现了资源加载失败(这里针对的是路径引用异常或者url解析错误时) 解决这个问题首先要明确一下几个步骤 1.什么情况或者什么时候重试 2.如何重试 3.重试过程中的边界处理 这里引入里三个测试脚本&#xff0c;分别加载里三个不同的脚…...

每日算法【双指针算法】(Day 2-复写零)

双指针算法 1.算法题目(复写零)2.讲解算法原理3.编写代码 1.算法题目(复写零) 注意&#xff1a;不要越界&#xff0c;不能开额外的数组&#xff0c;只能从现有数组上进行操作&#xff0c;没有返回值。 2.讲解算法原理 解法&#xff1a;双指针操作 先根据“异地”操作&#xf…...

【C++深入系列】:模版详解(上)

&#x1f525; 本文专栏&#xff1a;c &#x1f338;作者主页&#xff1a;努力努力再努力wz &#x1f4aa; 今日博客励志语录&#xff1a; 你不需要很厉害才能开始&#xff0c;但你需要开始才能很厉害。 ★★★ 本文前置知识&#xff1a; 类和对象&#xff08;上&#xff09; …...

PyCharm Flask 使用 Tailwind CSS v3 配置

安装 Tailwind CSS 步骤 1&#xff1a;初始化项目 在 PyCharm 终端运行&#xff1a;npm init -y安装 Tailwind CSS&#xff1a;npm install -D tailwindcss3 postcss autoprefixer初始化 Tailwind 配置文件&#xff1a;npx tailwindcss init这会生成 tailwind.config.js。 步…...

设计模式每日硬核训练 Day 15:享元模式(Flyweight Pattern)完整讲解与实战应用

&#x1f504; 回顾 Day 14&#xff1a;组合模式小结 在 Day 14 中&#xff0c;我们学习了组合模式&#xff08;Composite Pattern&#xff09;&#xff1a; 适用于构建树状层级结构&#xff0c;使得“单个对象”和“对象集合”统一操作。广泛用于文件系统、UI 控件树、组织结…...

使用Service发布应用程序

使用Service发布应用程序 文章目录 使用Service发布应用程序[toc]一、什么是Service二、通过Endpoints理解Service的工作机制1.什么是Endpoints2.创建Service以验证Endpoints 三、Service的负载均衡机制四、Service的服务发现机制五、定义Service六、Service类型七、无头Servic…...

美家市场2025电视版分享码-美家市场电视直播软件分享码免费获取

美家市场2025电视版作为一款备受欢迎的应用市场&#xff0c;为用户提供了海量的电视直播软件&#xff0c;而分享码则是免费获取这些资源的重要途径。与此同时&#xff0c;乐看家桌面也是一款在智能电视领域极具特色的软件&#xff0c;它能与美家市场搭配使用&#xff0c;为用户…...

动手学深度学习:手语视频在NiN模型中的测试

前言 NiN模型是在LeNet的基础上修改&#xff0c;提出了1x1卷积层和全局平均池化层的概念&#xff0c;减少了全连接所带来的参数量很多的问题。本篇在之前代码的基础上添加了模型保存&#xff0c;loss和acc记录以及记录模型时间等功能&#xff0c;所以模型后面的代码会重新记录…...

医院数据中心智能化数据上报与调数机制设计

针对医院数据中心的智能化数据上报与调数机制设计,需兼顾数据安全性、效率性、合规性及智能化能力。以下为系统性设计方案,分为核心模块、技术架构和关键流程三部分: 一、核心模块设计 1. 数据上报模块 子模块功能描述多源接入层对接HIS/LIS/PACS/EMR等异构系统,支持API/E…...

Ubuntu命令速查

当你在Ubuntu系统中需要快速查询常用命令时&#xff0c;可以使用以下速查表&#xff1a; 列出文件和目录&#xff1a; ls切换目录&#xff1a; cd [目录路径]显示当前工作目录的绝对路径&#xff1a; pwd创建新目录&#xff1a; mkdir [目录名]删除文件或目录&#xff1a; rm […...

一次制作参考网杂志的阅读书源的实操经验总结(附书源)

文章目录 一、背景介绍二、书源文件三、详解制作书源&#xff08;一&#xff09;打开Web服务&#xff08;二&#xff09;参考网结构解释&#xff08;三&#xff09;阅读书源 基础&#xff08;四&#xff09;阅读书源 发现&#xff08;五&#xff09;阅读书源 详细&#xff08;六…...

python抓取HTML页面数据+可视化数据分析(投资者数量趋势)

本文所展示的代码是一个完整的数据采集、处理与可视化工具&#xff0c;主要用于从指定网站下载Excel文件&#xff0c;解析其中的数据&#xff0c;并生成投资者数量的趋势图表。以下是代码的主要功能模块及其作用&#xff1a; 1.网页数据获取 使用fetch_html_page函数从目标网…...

下拉框select标签类型

在我们很多页面里有下拉框的选择&#xff0c;这种元素怎么定位呢&#xff1f;下拉框分为两种类型&#xff1a;我们分别针对这两种元素进行定位和操作 select标签 &#xff1a; 通过select类处理。 非select标签 1、针对下拉框元素&#xff0c;如果是Select标签类型&#xff0c;…...

嵌入式C语言位操作的几种常见用法

作为一名老单片机工程师&#xff0c;我承认&#xff0c;当年刚入行的时候&#xff0c;最怕的就是看那些密密麻麻的寄存器定义&#xff0c;以及那些让人眼花缭乱的位操作。 尤其是遇到那种“明明改了寄存器&#xff0c;硬件就是不听话”的情况&#xff0c;简直想把示波器砸了&am…...

数据库原理及应用mysql版陈业斌实验四

&#x1f3dd;️专栏&#xff1a;Mysql_猫咪-9527的博客-CSDN博客 &#x1f305;主页&#xff1a;猫咪-9527-CSDN博客 “欲穷千里目&#xff0c;更上一层楼。会当凌绝顶&#xff0c;一览众山小。” 目录 实验四索引与视图 1.实验数据如下 student 表&#xff08;学生表&…...

【免登录ORACLE,jdk8安装包下载】jdk-8u441-windows-i586.exe和jdk-8u441-windows-x64.exe有什么区别

jdk-8u441-windows-i586.exe和jdk-8u441-windows-x64.exe主要有以下区别&#xff1a; 我用夸克网盘分享了「jdk」&#xff0c;链接&#xff1a;https://pan.quark.cn/s/c72666843e2b 适用系统架构&#xff1a; jdk-8u441-windows-i586.exe适用于32位的Windows操作系统&#x…...

Oracle日志系统之附加日志

Oracle日志系统之附加日志 在 Oracle 数据库中&#xff0c;附加日志&#xff08;Supplemental Log&#xff09;是一种增强日志记录的机制&#xff0c;用于在数据库的 redo log 中记录更多的变更信息&#xff0c;尤其是在进行数据迁移、复制和同步等任务时&#xff0c;能够确保…...

从零到一:管理系统设计新手如何快速上手?

管理系统设计是一项复杂而富有挑战性的任务&#xff0c;它要求设计者具备多方面的知识和技能&#xff0c;包括需求分析、架构设计、数据管理、用户界面设计等。对于初次接触这一领域的新手而言&#xff0c;如何快速上手并成为一名合格的管理系统设计者呢&#xff1f;本文将从管…...

Web 前端包管理工具深度解析:npm、yarn、pnpm 全面对比与实战建议

引言: 在现代web前端开发中,包管理工具的重要性不言而喻,无论是构建项目脚手架,安装ui库,管理依赖版本,还是实现monorepo项目结构,一个高效稳定的包管理工具都会大幅提升开发体验和协作效率 作为一名前端工程师,深入了解这些工具背后的机制与差异,对于提升项目可维护性和团队…...

Windows 图形显示驱动开发-WDDM 1.2功能—Windows 8 中的 DirectX 功能改进(六)

一、具有多示例抗别名示例访问权限的 UAV Direct3D 11 允许光栅化到无序访问视图&#xff0c; (UAV) 没有呈现目标视图 (RTV) /DSV 绑定。 即使 UAV 可以具有任意大小&#xff0c;实现也可以使用视区/剪刀矩形的像素尺寸来操作光栅器。 DirectX 11 硬件的示例模式仅为单个示例…...

Jenkins 多分支流水线: 如何创建用于 Jenkins 状态检查的 GitHub 应用

使用 Jenkins 多分支流水线时&#xff0c;您可以将状态检查与 GitHub 拉取请求集成。 以下是状态检查的示例 要实现这些类型的状态检查&#xff0c;您需要创建一个与 Jenkins 主实例集成的 GitHub 应用。 在本博客中&#xff0c;我们将介绍如何创建一个 GitHub 应用&#xff…...

LeeCode912. 排序数组

给你一个整数数组 nums&#xff0c;请你将该数组升序排列。 你必须在 不使用任何内置函数 的情况下解决问题&#xff0c;时间复杂度为 O(nlog(n))&#xff0c;并且空间复杂度尽可能小。 示例 1&#xff1a; 输入&#xff1a;nums [5,2,3,1] 输出&#xff1a;[1,2,3,5]示例 2…...

Maven 简介(图文)

Maven 简介 Maven 是一个Java 项目管理和构建的工具。可以定义项目结构、项目依赖&#xff0c;并使用统一的方式进行自动化构建&#xff0c;是Java 项目不可缺少的工具。 Maven 的作用 提供标准化的项目结构&#xff1a;以前不同的开发工具创建的项目结构是不一样的&#xf…...

深入规划 Elasticsearch 索引:策略与实践

一、Elasticsearch 索引概述 &#xff08;一&#xff09;索引基本概念 Elasticsearch 是一个分布式、高性能的全文搜索引擎&#xff0c;其核心概念之一便是索引。索引本质上是一个存储文档的逻辑容器&#xff0c;它使得数据能够在高效的检索机制下被查询到。当我们对文档进行…...

基于X86/RK/全志+FPGA+AI工业一体机在电力接地系统中的应用方案

随着电力技术的发展和需求增加&#xff0c;智能电网建设受到全球关注。电力五防系统建设是确保我国电力安全的核心任务&#xff0c;接地管理系统是其中的关键部分&#xff0c;对电力系统的安全、稳定和高效运行至关重要。工业一体机&#xff0c;凭借其卓越的性能、稳定性和环境…...

论文阅读:2024 arxiv AI Safety in Generative AI Large Language Models: A Survey

总目录 大模型安全相关研究&#xff1a;https://blog.csdn.net/WhiffeYF/article/details/142132328 AI Safety in Generative AI Large Language Models: A Survey https://arxiv.org/pdf/2407.18369 https://www.doubao.com/chat/3262156521106434 速览 研究动机&#x…...

JVM对象创建全过程

JVM对象创建全过程深度解析 1. 对象创建的整体流程 JVM创建对象的过程可以分为7个关键步骤&#xff0c;从类检查到内存分配&#xff0c;再到对象初始化&#xff1a; 类加载检查 → 内存分配 → 内存空间初始化 → 对象头设置 → 构造函数执行 → 栈帧引用建立 → 对象使用2.…...

ubuntu 22.04 使用ssh-keygen创建ssh互信账户

现有两台ubuntu 22.04服务器&#xff0c;ip分别为192.168.66.88和192.168.88.66。需要将两台服务器创建新用户并将新用户做互信。 创建账户 adduser user1 # 如果此用户不想使用密码&#xff0c;直接一直回车就行&#xff0c;创建的用户是没法使用用户密码进行登陆的 su - …...

蓝牙开发那些事儿12——(记一颗BLE芯片BringUp折腾过程)

1.背景 蓝牙这个系列已经很久很久没有更新了&#xff0c;感慨良多。 现在写这篇文章主要是BringUp一颗蓝牙芯片的过程中遇到了一些奇怪的问题&#xff0c;想了一些办法&#xff0c;一一克服了&#xff0c;看看对其他做蓝牙的同学有没有启发。 同时也安利一个叫做HACKRF的设备…...

从零构建 Vue3 登录页:结合 Vant 组件与 Axios 实现完整登录功能

在 Web 开发的世界里&#xff0c;登录页是用户与应用交互的第一道门槛&#xff0c;它的体验好坏直接影响着用户对整个应用的印象。本文将详细记录如何使用 Vue3、Vant 组件库和 Axios 构建一个兼具美观与实用的登录页面&#xff0c;并实现完整的登录逻辑与数据验证&#xff0c;…...

AutoSAR从概念到实践系列之MCAL篇(一)——MCAL架构及其模块详解

欢迎大家学习我的《AutoSAR从概念到实践系列之MCAL篇》系列课程,我是分享人M哥,目前从事车载控制器的软件开发及测试工作。 学习过程中如有任何疑问,可底下评论! 如果觉得文章内容在工作学习中有帮助到你,麻烦点赞收藏评论+关注走一波!感谢各位的支持! 老规矩,…...