【C语言】结构体、联合体、枚举类型的字节大小详解

在C语言中,结构体(struct)和联合体(union) 是常用的复合数据类型,它们的内存布局和字节大小直接影响程序的性能和内存使用。下面为大家详细解释它们的字节大小计算方法,包括对齐规则、内存分配方式及代码示例分析。

结构体(struct)

结构体的定义:
  • 结构体是一种将多个类型的变量组合在一起的复合数据类型,每个成员都有自己的存储空间。
  • 每个成员按顺序存储。
  • 目的:创建新的类型,可面向对象编程,实例化一整个对象 —> 结构体。

语法:

 struct [标签] {成员属性1;成员属性2;成员属性3;成员属性4;};// 结构体的关键字 : struct // 标签 可有 可无  // 一个个成员都是 分号 结尾 

不带标签的定义:

struct {int a; int b; char c;};  // 有了新的类型
//定义该类型变量:
struct {int a; int b; char c;} xx;
//取别名:
typedef struct {int a; int b; char c;} yy_t;
yy_t zz;

带标签的定义:

struct point {int x; int y;}  // 创建了新的标签 
//定义类型:
struct point {int x; int y;} xx; // 创建了point标签,定义xx变量
// 使用标签:
struct point sp;   // 使用point标签,前提:必须要有point标签typedef  struct point {int x; int y;} qq_t; // 取了个新的别名叫qq_t , 同时 创建了标签 point 
qq_t x; // 使用新的别名类型 创建变量 x 

注意事项:相同名字的标签 不可重复创建

为结构体成员赋值:

struct person 
{char name[20];int age;int sg;int tz;int cd;
};
struct person sp; 
// 当你拥有该类型 实例化 对象 ,取里面的成员,用 点(.)strcpy(sp.name,"jack");sp.age = 18;sp.sg = 180;sp.tz = 180;sp.cd = 18;
// 当你知道 该 实例化 对象 的地址的时候,取里面的成员 ,用 箭头 (->)
struct person *p = &sp;p->namep->agep->sgp->tzp->cdstruct person *xp = (struct person *)malloc(sizeof(struct person));xp->name xp->age

结构体初始化的三种形式:

struct person 
{char name[20];int age;int sg;int tz;int cd;
};
//第一种:struct person sp1 = {"jack",18, 180};struct person sp2 = {"jack",18, 180, 180, 18};
//第二种:(内核中结构体的初始化方式)struct person sp3 = {.name = "jack",.cd = 18,.sg = 180};
//第三种:struct person sp4 = {name:"jack",cd : 18,sg :180};
内存布局

字节对齐(Alignment):

  • 在分配内存时,编译器会根据硬件架构的要求进行对齐(Alignment),确保变量的地址是其类型所需的对齐倍数。
  • 对齐规则:
    1. 每个成员的起始地址必须是其自身类型对齐要求的倍数。
    2. 结构体的总大小必须是最大对齐要求的倍数。

计算结构体的字节数:

> 结构体最终的字节数一定是 对齐字节数的 整数倍
> 在32操作系统中,最大4字节对齐
> 在64操作系统中,最大8字节对齐
> 取 结构体中 最大的 那个成员基本组成类型字节数 作为 对齐字节数 
> 每个成员的起始位置到结构体的起始位置之间的字节数 是 该成员 基本组成 字节数的 整数倍 

影响结构体大小的因素:

  • 成员类型的对齐
    • 不同数据类型的对齐要求可能不同(通常与数据类型的大小一致)。
    • 示例(32位系统):
      • char:1字节对齐。
      • short:2字节对齐。
      • int、float:4字节对齐。
      • double:8字节对齐。
  • 编译器的填充(Padding)
    • 为了满足对齐要求,结构体成员之间可能会插入填充字节(Padding)。
    • 结构体的总大小也会填充到最大对齐要求的倍数。
  • 最大对齐要求
    • 结构体总大小必须是其最大成员对齐要求的倍数。

内存布局详情:

struct xx
{long long ll;char c;int *p;char name[21];short s;double d;float f;short x;
};

64位系统下结构体的字节数
32位系统下的结构体
32位系统下的结构体字节数

也可以人为设定对齐字节数

在32操作系统中,最大4字节对齐
在64操作系统中,最大8字节对齐#pragma pack(n)     n: 是2的幂次方  2^0   2^1 2^2  2^3 

代码示例:
1:无填充字节

#include <stdio.h>struct S1 {char a;      // 1字节int b;       // 4字节
};int main() {printf("Size of S1: %lu\n", sizeof(struct S1));return 0;
}

内存布局:

+---+---+---+---+
| a | P | P | P |  // char a (1字节) + 3字节填充
+---+---+---+---+
|       b       |  // int b (4字节)
+---+---+---+---+
  • char a 占 1 字节,但 int b 需要 4 字节对齐,因此插入 3 字节填充。
  • 总大小为 8 字节。
Size of S1: 8

2:多个对齐要求

#include <stdio.h>struct S2 {char a;      // 1字节double b;    // 8字节int c;       // 4字节
};int main() {printf("Size of S2: %lu\n", sizeof(struct S2));return 0;
}

内存布局:

+---+---+---+---+---+---+---+---+
| a | P | P | P | P | P | P | P |  // char a + 7字节填充
+---+---+---+---+---+---+---+---+
|           b                   |  // double b (8字节)
+---+---+---+---+---+---+---+---+
|       c       |   P   |   P   |  // int c (4字节) + 4字节填充
+---+---+---+---+---+---+---+---+
  • char a 占 1 字节,double b 需要 8 字节对齐,因此插入 7 字节填充。
  • int c 需要 4 字节对齐,但结构体总大小需为 8 的倍数,因此插入 4 字节填充。
  • 总大小为 24 字节。
Size of S2: 24

3:改变成员顺序减少填充
调整示例 2 的成员顺序:

struct S3 {double b;    // 8字节int c;       // 4字节char a;      // 1字节
};

内存布局:

+---+---+---+---+---+---+---+---+
|           b                   |  // double b (8字节)
+---+---+---+---+---+---+---+---+
|       c       |   a   |   P   |  // int c + char a + 3字节填充
+---+---+---+---+---+---+---+---+
  • 调整成员顺序后,总大小为 16 字节,减少了填充字节。

输出:

Size of S3: 16

4. 结构体嵌套的字节大小
嵌套结构体会继承成员的对齐规则,可能导致额外的填充字节。(此处仅做简单介绍,详细分析请跳转至 结构体嵌套 文章,对结构体的嵌套有详细说明)

代码

#include <stdio.h>struct Inner {char a;      // 1字节int b;       // 4字节
};struct Outer {char c;      // 1字节struct Inner inner;  // 8字节(受对齐规则影响)double d;    // 8字节
};int main() {printf("Size of Inner: %lu\n", sizeof(struct Inner));printf("Size of Outer: %lu\n", sizeof(struct Outer));return 0;
}

内存布局:

Inner:
+---+---+---+---+---+
| a | P |   b       |
+---+---+---+---+---+Outer:
+---+---+---+---+---+---+---+---+
| c | P |   Inner (8字节)       |
+---+---+---+---+---+---+---+---+
|               d               |
+---+---+---+---+---+---+---+---+
Inner 的大小为 8 字节(对齐到 4 的倍数)。
Outer 的最大对齐要求是 double d 的 8 字节,总大小为 24 字节。

输出:

Size of Inner: 8
Size of Outer: 24

联合体(union)

联合体的定义:
  • 联合体的所有成员共享同一块内存空间。
  • 联合体的大小取决于其最大成员的大小。
  • 联合体的对齐要求由最大成员的对齐要求决定。

语法:

union [标签] {成员属性;成员属性;成员属性;成员属性;
};

定义:

union {int a;short b;char c;
}   // 联合体 类型 typedef union {int a; short b; char c;} xx_t;//取别名
xx_t y;union qq{int a; short b; char c;}  // 有了新的联合体类型,并创建了新的标签
union qq xq; 

赋值:

typedef union {int a; short b; char c;} xx_t;
xx_t y;y.a = 10; //同结构体一样
(&y)->b = 20;

联合体的存储(字节数如何计算):

  • 占用空间最大的成员字节数作为基础字节数。
  • 最终的字节数一定是 每个成员基本组成类型字节数的整数倍。
union xx
{char name[20];long long ll;double d;int *p;short s;
};

示例代码中联合体的大小取决于其最大成员 char name[20];,所以大小为20字节。
联合体占用的字节大小
代码:
1:简单联合体

#include <stdio.h>union U1 {char a;      // 1字节int b;       // 4字节double c;    // 8字节
};int main() {printf("Size of U1: %lu\n", sizeof(union U1));return 0;
}
+---+---+---+---+---+---+---+---+
|               c               |  // double c (8字节)
+---+---+---+---+---+---+---+---+
  • 这个联合体的大小取决于其最大成员 double c,所以大小为 8 字节。

输出:

Size of U1: 8

2:联合体的对齐

#include <stdio.h>union U2 {char a;      // 1字节int b;       // 4字节short c;     // 2字节
};int main() {printf("Size of U2: %lu\n", sizeof(union U2));return 0;
}

内存布局:

+---+---+---+---+
|       b       |  // int b (4字节)
+---+---+---+---+
  • 联合体的最大成员是 int b(4 字节),所以联合体的大小为 4 字节。

输出:

Size of U2: 4

枚举类型(enum)

定义:枚举类型(enum)是C语言中定义一组命名整型常量的方法,用于表示一组离散的、有意义的值。 它是C语言的基本类型之一,主要用于提高代码的可读性和可维护性。

定义有些抽象,不太易于理解,用大白话翻译一下就是:① 结构体是把不同的成员捆绑在一起,形成一个新的类型,方便于面向对象编程,适用于实例化对象使用。② 联合体也是创建一个新的类型,只不过它的成员是共用一块空间,而结构体成员是分别使用空间。③ 枚举类型则是用于限制取值范围的。

语法:

enum [标签] {枚举常量,枚举常量,枚举常量,枚举常量,枚举常量
};
  • 枚举常量: 枚举常量是int型的常量,在使用int类型的任何地方都可以使用它。
  • 默认值: 没有特定指出常量值时,枚举列表中的常量被指定为整数值0、1、2等,依次递增。
  • 指定值: 可以选择常量具有的整数值,后面的常量会被赋予后续的值。

定义:

enum {XX,YY,ZZ,QQ,TT}  // 4个字节 enum {XX,YY,ZZ,QQ,TT} xy = XX;typedef  enum {XX,YY,ZZ,QQ,TT} hh_t;带标签:
enum Weekday {MON, TUE, WEN, THU, FRI,SAT, SUN};
MON : 0  ---> 依次往后加1 //枚举常量的值 下面的代码块中会进一步详细说明enum Weekday {MON=10,TUE, WEN, THU=100, FRI,SAT, SUN};  //这个类型 4个字节 
enum Weekday yy =  WEN;//赋值:只能在枚举类型中限定的范围内查找//枚举和 typedef:通过 typedef 为枚举类型定义别名,简化代码
typedef enum Weekday {MON=10,TUE, WEN, THU=100, FRI,SAT, SUN} week_t;void fun(week_t xx)
{}
fun(MON);//从此之后,此函数中的传值被限制了范围,只能在 enum Weekday中查找。

写一个示例代码,详细讲述一下枚举类型的使用场景:

enum 枚举类型名 {枚举常量1,枚举常量2,枚举常量3,...
};
  • enum:枚举类型的关键字。
  • 枚举类型名/[标签]:可选,表示该枚举的类型名称。
  • 枚举常量:一组用逗号分隔的命名常量,默认从 0 开始递增(可以手动指定值)。

使用:

#include <stdio.h>// 定义枚举类型
enum Color {RED,    // 默认值 0GREEN,  // 默认值 1BLUE    // 默认值 2
};int main() {enum Color myColor;  // 声明枚举变量myColor = GREEN;     // 给枚举变量赋值printf("My color is: %d\n", myColor);  // 输出枚举变量的值return 0;
}

输出:

My color is: 1

枚举常量的值

默认值

  • 枚举常量的值从 0 开始,依次递增。
  • 如果手动为某个枚举常量指定值,则后续常量的值在此基础上递增。

手动指定值

#include <stdio.h>// 定义枚举类型,并手动指定值
enum Weekday {MONDAY = 1,    // 指定为 1TUESDAY,       // 自动递增为 2WEDNESDAY = 5, // 指定为 5THURSDAY,      // 自动递增为 6FRIDAY         // 自动递增为 7
};int main() {printf("MONDAY = %d\n", MONDAY);printf("TUESDAY = %d\n", TUESDAY);printf("WEDNESDAY = %d\n", WEDNESDAY);printf("THURSDAY = %d\n", THURSDAY);printf("FRIDAY = %d\n", FRIDAY);return 0;
}

输出:

MONDAY = 1
TUESDAY = 2
WEDNESDAY = 5
THURSDAY = 6
FRIDAY = 7

枚举值的重复: 枚举常量可以有重复的值。

enum Example {A = 1,B = 1,  // B 和 A 的值相同C = 2
};

匿名枚举
  • 如果不需要为枚举类型定义名字,可以使用匿名枚举。
  • 枚举常量会成为全局常量,直接使用。

代码

#include <stdio.h>enum {SUCCESS = 0,FAILURE = -1
};int main() {printf("SUCCESS = %d\n", SUCCESS);printf("FAILURE = %d\n", FAILURE);return 0;
}

输出:

SUCCESS = 0
FAILURE = -1

枚举类型的大小
  • 枚举变量的本质:
    • 枚举类型在底层是一个整数类型,通常是 int(具体大小取决于编译器)。
  • 内存大小:
    • 一个枚举变量的大小与 int 相同(4字节或8字节,取决于平台)。

代码

#include <stdio.h>enum Example {A = 1,B,C
};int main() {printf("Size of enum: %lu bytes\n", sizeof(enum Example));return 0;
}

输出(在 64 位系统上):

Size of enum: 4 bytes
枚举类型的限制和注意事项

枚举变量的类型:

  • 枚举类型的底层是整型,因此可以与整数进行比较或赋值。
  • 但这种用法可能会降低代码的可读性。

代码说明

#include <stdio.h>enum Color {RED,GREEN,BLUE
};int main() {enum Color myColor;myColor = 1;  // 虽然可以赋值为整数,但不推荐printf("My color is: %d\n", myColor);return 0;
}

输出:

My color is: 1
//注意:虽然语法上允许,但这样会破坏枚举的意义。建议始终使用枚举常量赋值。

枚举类型的范围: 枚举常量的值不能超过整型的表示范围,其本质是个 int 常量。如果枚举值太大,可能会导致编译器警告或错误。
枚举和类型安全: C语言中的枚举并不强制类型安全。枚举变量可以被赋值为任何整数值,编译器不会报错。


枚举类型的作用
  1. 提高可读性:枚举类型使用有意义的命名代替魔法数字(Magic Numbers)。例如,使用 RED 代替数字 0,提高代码可读性。
  2. 提高可维护性:如果枚举的值发生变化,只需修改枚举定义,而不用修改其他代码。
  3. 限制变量取值范围:枚举变量只能取定义的枚举常量值,避免了非法值的使用。
枚举的高级用法

最后举 2 种枚举类型在编程中的常用场景:
1. 枚举结合 switch 语句使用: 枚举常常与 switch 语句结合使用,方便处理多个分支逻辑。

代码片:

#include <stdio.h>enum State {OFF,ON,SUSPEND
};int main() {enum State deviceState = ON;switch (deviceState) {case OFF:printf("Device is OFF.\n");break;case ON:printf("Device is ON.\n");break;case SUSPEND:printf("Device is in SUSPEND mode.\n");break;default:printf("Unknown state.\n");}return 0;
}

输出:

Device is ON.

2. 枚举用于位标志: 枚举可以用于定义位标志,方便对多个状态进行位操作。

代码片:

#include <stdio.h>enum Permission {READ = 1 << 0,  // 0001WRITE = 1 << 1, // 0010EXECUTE = 1 << 2 // 0100
};int main() {int permission = READ | WRITE;  // 组合权限if (permission & READ) {printf("Read permission is granted.\n");}if (permission & WRITE) {printf("Write permission is granted.\n");}if (permission & EXECUTE) {printf("Execute permission is granted.\n");}return 0;
}

输出:

Read permission is granted.
Write permission is granted.

综上。需要简单记住的是:
1. 结构体大小计算规则

  1. 每个成员按其对齐要求分配地址。
  2. 结构体总大小对齐到最大对齐要求的倍数。
  3. 填充(Padding)字节会增加结构体大小。

2 联合体大小计算规则

  1. 联合体的大小由最大成员的大小决定。
  2. 联合体的对齐要求由最大成员的对齐要求决定。

3. 枚举类型大小计算规则

  1. 枚举类型在底层是一个整数类型,通常是 int(具体大小取决于编译器)。
  2. 内存大小:一个枚举变量的大小与 int 相同(4字节或8字节,取决于平台)。

可优化建议

  1. 调整成员顺序:将对齐要求高的成员放在前面,减少填充字节。
  2. 使用 #pragma pack:可以改变默认对齐方式,但可能影响性能。
  3. 注意嵌套结构体的对齐:嵌套结构体的总大小也需满足对齐规则。

通过理解这些规则,可以优化结构体和联合体的内存布局,从而提高程序的性能和内存利用率。

此篇文章仅仅只是对结构体、联合体、枚举类型的基础教育,简单讲解了它们是如何占用内存空间大小的,下一篇文章中会更进一步的讲解说明;
其中包含:结构体嵌套以及实际开发中的使用,位域、无名位域和空域详解并包含嵌入式开发工作中实际场景说明。链接:位域、无名位域和空域详解

以上。仅供学习与分享交流,请勿用于商业用途!转载需提前说明。

我是一个十分热爱技术的程序员,希望这篇文章能够对您有帮助,也希望认识更多热爱程序开发的小伙伴。
感谢!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/62244.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【优选算法】位运算

目录 常见位运算总结1、基础位运算2、给一个数n&#xff0c;确定它的二进制位的第x位上是0还是13、将一个数n的二进制位的第x位改成14、将一个数n的二进制位的第x位改成05、位图的思想6、提取一个数n的二进制位中最右侧的17、将一个数n的二进制位中最右侧的1变为08、位运算的优…

jQuery九宫格抽奖,php处理抽奖信息

功能介绍 jQuery九宫格抽奖是一种基于jQuery库的前端抽奖效果。通过九宫格的形式展示抽奖项&#xff0c;用户点击抽奖按钮后&#xff0c;九宫格开始旋转&#xff0c;最终停在一个随机位置上&#xff0c;此位置对应的抽奖项为用户的中奖结果。 本文实现九宫格的步骤为&#xf…

AI界的信仰危机:单靠“规模化”智能增长的假设,正在面临挑战

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

Unity类银河战士恶魔城学习总结(P149 Screen Fade淡入淡出菜单)

【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili 教程源地址&#xff1a;https://www.udemy.com/course/2d-rpg-alexdev/ 本章节实现了进入游戏和死亡之后的淡入淡出动画效果 UI_FadeScreen.cs 1. Animator 组件的引用 (anim) 该脚本通过 Animator 控制 UI 元…

【C语言篇】探索 C 语言结构体:从基础语法到数据组织的初体验

我的个人主页 我的专栏&#xff1a;C语言&#xff0c;希望能帮助到大家&#xff01;&#xff01;&#xff01;点赞❤ 收藏❤ 目录 什么是结构体结构体的定义与使用结构体内存布局嵌套结构体与指针结构体数组的操作结构体与函数结构体内存对齐机制位域与结构体的结合动态内存分…

COMSOL工作站:配置指南与性能优化

COMSOL Multiphysics 求解的问题类型相当广泛&#xff0c;提供了仿真单一物理场以及灵活耦合多个物理场的功能&#xff0c;供工程师和科研人员来精确分析各个工程领域的设备、工艺和流程。 软件内置的#模型开发器#包含完整的建模工作流程&#xff0c;可实现从几何建模、材料参数…

大语言模型LLM的微调代码详解

代码的摘要说明 一、整体功能概述 这段 Python 代码主要实现了基于 Hugging Face Transformers 库对预训练语言模型&#xff08;具体为 TAIDE-LX-7B-Chat 模型&#xff09;进行微调&#xff08;Fine-tuning&#xff09;的功能&#xff0c;使其能更好地应用于生成唐诗相关内容的…

qt5.14.2跟vs2022配置

1.qt6要在线安装&#xff0c;安装时间比较长&#xff0c;要求网络要稳定&#xff0c;不适合快速安装 2.使用qt5.14.2离线安装包&#xff0c;安装速度快&#xff0c;可以快速安装。 3.安装完qt.5.14.2后打开QtCreate4.0.1&#xff0c;打开 工具->选项->Kits,发现如下图: 没…

【拥抱AI】RAG(Retrieval-Augmented Generation)知识库的切片策略及其改进

1. RAG简介 RAG是一种结合了信息检索和文本生成的技术&#xff0c;它通过从一个外部的知识库中检索相关信息来增强生成模型的能力。这种方法可以提高生成内容的相关性和准确性&#xff0c;特别是在处理长文档时&#xff0c;有效的文本切片策略对于提升检索效率和质量至关重要。…

webrtc ios h264 硬编解码

webrtc ios h264 硬编解码 一 ios 系统支持 从ios8开始&#xff0c;苹果公司开放了硬解码和硬编码API&#xff08;即 VideoToolbox.framework API&#xff09; 二 主要api 1 主要解码函数 VTDecompressionSessionCreate // 创建解码 session VTDecompressionSession…

深入解析 MySQL 启动方式:`systemctl` 与 `mysqld` 的对比与应用

目录 前言1. 使用 systemctl 启动 MySQL1.1 什么是 systemctl1.2 systemctl 启动 MySQL 的方法1.3 应用场景1.4 优缺点优点缺点 2. 使用 mysqld 命令直接启动 MySQL2.1 什么是 mysqld2.2 mysqld 启动 MySQL 的方法2.3 应用场景2.4 优缺点优点缺点 3. 对比分析结语 前言 MySQL …

Ubuntu20.04运行LARVIO

文章目录 1.运行 Toyish 示例程序2.运行 ROS Nodelet参考 1.运行 Toyish 示例程序 LARVIO 提供了一个简化的toyish示例程序&#xff0c;适合快速验证和测试。 编译项目 进入 build 文件夹并通过 CMake 编译项目&#xff1a; mkdir build cd build cmake -D CMAKE_BUILD_TYPER…

[2024年3月10日]第15届蓝桥杯青少组stema选拔赛C++中高级(第二子卷、编程题(2))

方法一&#xff08;string&#xff09;&#xff1a; #include <iostream> #include <string> using namespace std;// 检查是否为回文数 bool isPalindrome(int n) {string str to_string(n);int left 0, right str.size() - 1;while (left < right) {if (s…

HTML 中 a 标签跳转问题总结:从框架页面跳转的困境与突破

在 HTML 网页开发过程中&#xff0c;a 标签作为超链接的常用标记&#xff0c;其跳转功能看似简单&#xff0c;实则在一些特定场景下会遇到诸多复杂问题。本文将围绕一个具体的案例展开&#xff0c;深入探讨在框架页面中使用 a 标签跳转时所面临的挑战以及相应的解决方案&#x…

【Db First】.NET开源 ORM 框架 SqlSugar 系列

.NET开源 ORM 框架 SqlSugar 系列 【开篇】.NET开源 ORM 框架 SqlSugar 系列【入门必看】.NET开源 ORM 框架 SqlSugar 系列【实体配置】.NET开源 ORM 框架 SqlSugar 系列【Db First】.NET开源 ORM 框架 SqlSugar 系列【Code First】.NET开源 ORM 框架 SqlSugar 系列 &#x1f…

课题组自主发展了哪些CMAQ模式预报相关的改进技术?

空气污染问题日益受到各级政府以及社会公众的高度重视&#xff0c;从实时的数据监测公布到空气质量数值预报及预报产品的发布&#xff0c;我国在空气质量监测和预报方面取得了一定进展。随着计算机技术的高速发展、空气污染监测手段的提高和人们对大气物理化学过程认识的深入&a…

扫雷-完整源码(C语言实现)

云边有个稻草人-CSDN博客 在学完C语言函数之后&#xff0c;我们就有能力去实现简易版扫雷游戏了&#xff08;成就感满满&#xff09;&#xff0c;下面是扫雷游戏的源码&#xff0c;快试一试效果如何吧&#xff01; 在test.c里面进行扫雷游戏的测试&#xff0c;game.h和game.c…

uniapp在App端定义全局弹窗,当打开关闭弹窗会触发onShow、onHide生命周期怎么解决?

在uniapp(App端)中实现自定义弹框&#xff0c;可以通过创建一个透明页面来实现。点击进入当前页面时&#xff0c;页面背景会变透明&#xff0c;用户可以根据自己的需求进行自定义&#xff0c;最终效果类似于弹框。 遇到问题&#xff1a;当打开弹窗(进入弹窗页面)就会触发当前页…

【C++】C++新增特性解析:Lambda表达式、包装器与绑定的应用

V可变参数模板与emplace系列 C语法相关知识点可以通过点击以下链接进行学习一起加油&#xff01;命名空间缺省参数与函数重载C相关特性类和对象-上篇类和对象-中篇类和对象-下篇日期类C/C内存管理模板初阶String使用String模拟实现Vector使用及其模拟实现List使用及其模拟实现…

HTB:Chatterbox[WriteUP]

目录 Connect to the HackTheBox server and spawn target machine Infomation Collection Use Rustscan to perform oepn scanning on the TCP port of the target Use Nmap to perform script and service scanning on the TCP port of the target Use Curl accessing p…