【C语言】结构体+位段+枚举+联合(2)

news2024/10/7 6:46:36

大家好,我是苏貝,本篇博客带大家了解结构体和位段以及枚举,如果你觉得我写的还不错的话,可以给我一个赞👍吗,感谢❤️
在这里插入图片描述


这是这个系列的第二篇,上一篇详细介绍了结构体的基本知识,详情请点击

目录

  • 一.结构体
    • 1.1 结构体内存对齐
    • 1.2 修改默认对齐数
    • 1.3 结构体传参
  • 二. 位段
    • 2.1 什么是位段
    • 2.2 位段的内存分配
    • 2.3 位段的跨平台问题
  • 三. 枚举
    • 3.1 枚举类型的定义
    • 3.2 枚举的使用
    • 3.3 枚举的优点
  • 四. 联合(共用体)
    • 4.1 联合类型的定义
    • 4.2 联合的特点
    • 4.3 联合的应用
    • 4.4 联合大小的计算

一.结构体

1.1 结构体内存对齐

现在大家应该都已经掌握了结构体的基本使用了,现在我们深入讨论一个问题:计算结构体的大小。这也是一个特别热门的考点: 结构体内存对齐

在正式讲解内存对齐之前,先用下面的代码来引入。你觉得答案是什么?

struct S1
{
	char a;
	char b;
	int c;
};

struct S2
{
	char a;
	int c;
	char b;
};

int main()
{
	printf("%d\n", sizeof(struct S1));
	printf("%d\n", sizeof(struct S2));
	return 0;
}

在这里插入图片描述

你可以看见,答案居然不一样,可是两个结构体的成员是一样的呀,只是三个成员变量的顺序不同罢了。那我们现在就用可以计算结构体成员相较于起始位置的偏移量的宏offsetof

在这里插入图片描述

offserof括号里面的第一个参数是结构体类型,第二个是结构体成员。头文件:<stddef.h>

#include<stdio.h>
#include<stddef.h>

struct S1
{
	char c1;
	char c2;
	int i;
};

struct S2
{
	char c1;
	int i;
	char c2;
};

int main()
{
	printf("%d ", offsetof(struct S1, c1));
	printf("%d ", offsetof(struct S1, c2));
	printf("%d\n", offsetof(struct S1, i));

	printf("%d ", offsetof(struct S2, c1));
	printf("%d ", offsetof(struct S2, i));
	printf("%d\n", offsetof(struct S2, c2));
	return 0;
}

在这里插入图片描述

我们发现,三个成员变量的顺序不同时,它们中的相同位置的相较于起始位置的偏移量不同,为什么呢?让我们来了解一下结构体的内存对齐

如何计算?
首先得掌握结构体的对齐规则

  1. 第一个成员在与结构体变量偏移量为0的地址处。
  2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。
    对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。
    ○VS中默认的值为8
    ○Linux环境中gcc这个编译器没有默认对齐数,对齐数就是成员自身的大小
  3. 结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍。
  4. 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整
    体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。

下面我用的是VS
范例1:
创建一个类型为struct S1的变量s1,开辟空间时假如是从下图中的0开始的(下图中每个格子代表一个字节), 第一个成员在与结构体变量偏移量为0的地址处,大小是1byte,只占1个字节。第二个成员是char类型的,大小是1byte,VS默认对齐数是8,8>1,所以对齐数是1,从地址是1的倍数开始占1个字节。第三个成员是int类型的,大小是4byte,VS默认对齐数是8,8>4,所以对齐数是4,从地址是4的倍数开始占4个字节。此时结构体占8个字节。结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍,第一个成员大小是1byte,8>1,所以对齐数是1,第二个成员对齐数是1,第三个成员对齐数是4,所以最大对齐数要是4的整数倍,8=4 * 2,可以,因此struct S1的大小为8byte。图中颜色块中间的白色部分是被浪费的内存
在这里插入图片描述

范例2:
创建一个类型为struct S2的变量s2,开辟空间时假如是从下图中的0开始的(下图中每个格子代表一个字节), 第一个成员在与结构体变量偏移量为0的地址处,大小是1byte,只占1个字节。第二个成员是int类型的,大小是4byte,VS默认对齐数是8,8>4,所以对齐数是4,从地址是4的倍数开始占4个字节。第三个成员是char类型的,大小是1byte,VS默认对齐数是8,8>1,所以对齐数是1,从地址是1的倍数开始占1个字节。此时结构体占9个字节。结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍,第一个成员大小是1byte,8>1,所以对齐数是1,第二个成员对齐数是4,第三个成员对齐数是1,所以最大对齐数要是4的整数倍,9!=4 * 2,不行。12=4 * 3,可以,因此struct S2的大小为12byte

在这里插入图片描述

范例3:

struct S3
{
	double d;
	char c;
	int i;
};
int main()
{
	printf("%d\n", sizeof(struct S3));
	return 0;
}

r4

创建一个类型为struct S3的变量s3,开辟空间时假如是从下图中的0开始的(下图中每个格子代表一个字节), 第一个成员在与结构体变量偏移量为0的地址处,大小是8byte,占8个字节。第二个成员是char类型的,大小是1byte,VS默认对齐数是8,8>1,所以对齐数是1,从地址是1的倍数开始占1个字节。第三个成员是int类型的,大小是4byte,VS默认对齐数是8,8>4,所以对齐数是4,从地址是4的倍数开始占4个字节。此时结构体占16个字节。结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍,第一个成员大小是8byte,8==8,所以对齐数是8,第二个成员对齐数是1,第三个成员对齐数是4,所以最大对齐数要是8的整数倍,16=8 * 2,可以,因此struct S3的大小为16byte

在这里插入图片描述

范例4:

struct S3
{
	double d;
	char c;
	int i;
};
struct S4
{
	char c1;
	struct S3 s3;
	double d;
};
int main()
{
	printf("%d\n", sizeof(struct S4));
	return 0;
}

在这里插入图片描述
创建一个类型为struct S4的变量s4,开辟空间时假如是从下图中的0开始的(下图中每个格子代表一个字节), 第一个成员在与结构体变量偏移量为0的地址处,大小是1byte,占1个字节。第二个成员是结构体类型的,嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处即8的倍数处,大小是16byte。第三个成员是double类型的,大小是8byte,VS默认对齐数是8,8 ==8,所以对齐数是8,从地址是8的倍数开始占8个字节。此时结构体占32个字节。结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍,第一个成员大小是1byte,8 >1,所以对齐数是1,第二个成员对齐数是8,第三个成员对齐数是8,所以最大对齐数要是8的整数倍,32=8 * 4,可以,因此struct S4的大小为32byte
在这里插入图片描述

为什么存在内存对齐?

大部分的参考资料都是如是说的:

  1. 平台原因(移植原因):
    不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特
    定类型的数据,否则抛出硬件异常
  2. 性能原因:
    数据结构(尤其是栈)应该尽可能地在自然边界上对齐。
    原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问
    在这里插入图片描述

总体来说:

结构体的内存对齐是拿空间来换取时间的做法。

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

让占用空间小的成员尽量集中在一起

例如:将第一段代码写成第二段代码

struct S1
{
	char c1;
	int i;
	char c2;
};
struct S2
{
	char c1;
	char c2;
	int i;
};

1.2 修改默认对齐数

我们可以使用#pragma 这个预处理指令来改变默认对齐数

#pragma pack(4)//设置默认对齐数为4
struct S1
{
	char c1;
	int i;
	char c2;
};
#pragma pack()//取消设置的默认对齐数,还原为默认

#pragma pack(2)//设置默认对齐数为2
struct S2
{
	char c1;
	int i;
	char c2;
};
#pragma pack()//取消设置的默认对齐数,还原为默认

int main()
{
	//输出的结果是什么?
	printf("%d\n", sizeof(struct S1));
	printf("%d\n", sizeof(struct S2));
	return 0;
}

在这里插入图片描述

在这里插入图片描述


1.3 结构体传参

直接上代码,请问下面的 print1 和 print2 函数哪个好些?

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;
}

答案:print2函数。
原因:函数传参的时候,参数是需要压栈,会有时间和空间上的系统开销。如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的下降。也可以这样想,传值调用的形参是实参的一份临时拷贝,开辟一个临时空间需要空间,而且拷贝也需要时间,因此传值调用的效率不高,所以尽量使用传址调用

那也有人要说了,print1比print2要安全呀,因为如果print1函数修改了形参的值的话,实参的结构体并不会被修改。但是如果print2函数修改了值,那么实参的结构体很轻易地被修改。是的,所以我们可以在形参struct S* ps前加const来保证ps指向的内容不会被修改


二. 位段

2.1 什么是位段

位段的声明和结构是类似的,有两个不同:
1.位段的成员必须是 int、unsigned int 或signed int 。(在C99之后,也可以是其它类型,但是基本上都是int,char)
2.位段的成员名后边有一个冒号和一个数字

比如:

struct A
{
	int _a : 2;//_a占用2个bit的空间
	int _b : 5;//_b占用5个bit的空间
	int _c : 10;//……
	int _d : 30;
};

A就是一个位段类型。那位段A的大小是多少

printf("%d\n", sizeof(struct A));

2.2 位段的内存分配

  1. 位段的成员可以是 int 、unsigned int、 signed int 或者是 char (属于整形家族)类型
  2. 位段的空间上是按照需要以4个字节( int )或者1个字节( char )的方式来开辟的。
  3. 位段涉及很多不确定因素,位段是不跨平台的,注重可移植的程序应该避免使用位段

以下代码空间是如何开辟的?

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;
}

在这里插入图片描述

2.3 位段的跨平台问题

  1. int 位段被当成有符号数还是无符号数是不确定的。
  2. 位段中最大位的数目不能确定。(16位机器最大16,32位机器最大32,写成27,在16位机器会出问题。
  3. 位段中的成员在内存中从左向右分配,还是从右向左分配标准尚未定义。
  4. 当一个结构包含两个位段,第二个位段成员比较大,无法容纳于第一个位段剩余的位时,是舍弃剩余的位还是利用,这是不确定的

总结:

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


三. 枚举

枚举顾名思义就是把可能的取值一一列举。比如我们现实生活中:一周的星期一到星期日是有限的7天,可以一一列举,性别有:男、女、保密,也可以一一列举,月份有12个月,也可以一一列举

3.1 枚举类型的定义

enum Gender
{
	MALE,
	FEMALE,
	SECRET
};

enum Day
{
	MON,
	TUES,
	WED,
	THUR,
	FRI,
	SAT,
	SUN
};

以上定义的 enum Day , enum Gender 都是枚举类型。{ }中的内容是枚举类型的可能取值,也叫枚举常量.
这些可能取值都是有值的,默认从0开始,一次递增1,当然在定义的时候也可以赋初值

范例1:
默认从0开始,一次递增1

enum Gender
{
	MALE,
	FEMALE,
	SECRET
};
int main()
{
	printf("%d\n", MALE);
	printf("%d\n", FEMALE);
	printf("%d\n", SECRET);
	return 0;
}

在这里插入图片描述

范例2:
在定义的时候部分赋初值,后面的一次递增1

enum Gender
{
	MALE = 3,
	FEMALE,
	SECRET
};
//下面的main函数和范例1一样,就不再写了

在这里插入图片描述

范例3:
在定义的时候全部赋初值

enum Gender
{
	MALE = 3,
	FEMALE = 7,
	SECRET = 1
};
//下面的main函数和范例1一样,就不再写了

在这里插入图片描述

3.2 枚举的使用

只能拿枚举常量给枚举变量赋值,才不会出现类型的差异。如果将整型赋给枚举变量,可能会报错

enum Gender
{
	MALE,
	FEMALE,
	SECRET
};

int main()
{
	enum Gender gender = FEMALE;
	enum Gender gender1 = 2;//ok?
	return 0;
}

3.3 枚举的优点

为什么使用枚举?我们可以使用 #define 定义常量,为什么非要使用枚举?
枚举的优点:

  1. 增加代码的可读性和可维护性
  2. 和#define定义的标识符比较枚举有类型检查,更加严谨。
  3. 防止了命名污染(封装)
  4. 便于调试
  5. 使用方便,一次可以定义多个常量

四. 联合(共用体)

4.1 联合类型的定义

联合也是一种特殊的自定义类型。这种类型定义的变量也包含一系列的成员,特征是这些成员共用同一块空间(所以联合也叫共用体)。比如:

//联合类型的声明
union Un
{
	char c;
	int i;
};
//联合变量的定义
union Un un;
//计算1个联合体变量的大小
printf("%d\n", sizeof(un));

4.2 联合的特点

联合的成员是共用同一块内存空间的,这样一个联合变量的大小,至少是最大成员的大小(因为联合至少得有能力保存最大的那个成员)。下面输出语句的结果是一样的吗?

union Un
{
	int i;
	char c;
};
int main()
{
	union Un un;
	printf("%p\n", &un);
	printf("%p\n", &(un.i));
	printf("%p\n", &(un.c));
	return 0;
 }

在这里插入图片描述

它们的输出结果相同,证明了联合的成员是共用同一块内存空间的
注意:联合体在同一时间只能使用1个,否则可能会出现问题
在这里插入图片描述

4.3 联合的应用

面试题:判断当前计算机的大小端存储

我们可能会想到下面这种方法:创造一个整型变量a并赋值为1
在这里插入图片描述
所以我们只要判断整型变量a的第一个字节的内容是1还是0就可以判断是上面存储方式了。所以我们将a的地址取出,强制类型转化为char * 类型的,此时该地址就是第一个字节的地址,再对该地址解引用就能找到该地址指向的内容

int check()
{
	int a = 1;
	return *(char*)&a;
}
int main()
{
	int ret = check();
	if (ret == 1)
		printf("小端存储");
	else
		printf("大端存储");
	return 0;
}

其实,还有一种很巧妙的方法,用联合体
因为联合的成员是共用同一块内存空间的,所以un.c访问的就是un.i的第一个字节

int check()
{
	union
	{
		char c;
		int i;
	}un;
	un.i = 1;
	return un.c;
}
int main()
{
	int ret = check();
	if (ret == 1)
		printf("小端存储");
	else
		printf("大端存储");
	return 0;
}

4.4 联合大小的计算

○联合的大小至少是最大成员的大小。
○当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍

范例1:
最大成员大小是5byte。我们在上面结构体内存对齐时说过,对齐数 = 编译器默认的一个对齐数与该成员大小的较小值,VS的默认对齐数是8,字符数组是一群字符类型的变量的集合,它们占1byte<8,所以char的对齐数是1。int的对齐数是4,所以最大对齐数是4,最大成员大小5不是4的整数倍,8 ==4 * 2,所以联合体的大小是8byte

union
{
	char c[5];
	int i;
}un;

int main()
{
	printf("%d\n", sizeof(un));
	return 0;
}

在这里插入图片描述

范例1:
最大成员大小是14byte。短整型数组是一群短整型类型的变量的集合,它们占2byte<8,所以short的对齐数是2。int的对齐数是4,所以最大对齐数是4,最大成员大小14不是4的整数倍,16 ==4 * 4,所以联合体的大小是16byte

union
{
	short c[7];
	int i;
}un;

int main()
{
	printf("%d\n", sizeof(un));
	return 0;
}

在这里插入图片描述


好了,那么本篇博客就到此结束了,如果你觉得本篇博客对你有些帮助,可以给个大大的赞👍吗,感谢看到这里,我们下篇博客见❤️

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

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

相关文章

基于SSM的高校疫情管理系统的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

HTML 核心技术点基础详细解析以及综合小案例

核心技术点 网页组成 排版标签 多媒体标签及属性 综合案例一 - 个人简介 综合案例二 - Vue 简介 02-标签语法 HTML 超文本标记语言——HyperText Markup Language。 超文本&#xff1a;链接 标记&#xff1a;标签&#xff0c;带尖括号的文本 标签结构 标签要成…

python基于协同过滤算法商品商城购物推荐系统vue

随着移动互联网的普及&#xff0c;电子商务的发展也引来了新一轮的发展&#xff0c;越来越手动消费者的喜爱&#xff0c;网络经济的发展对国家经济的发展也带来了很大的利好&#xff0c;带动了很多实体经济的转型&#xff0c;用户可以通过网络可以买到自己称心如意的商品&#…

Windows提权方法论

Windows提权方法论 1.溢出漏洞提权2.计划任务提权3.SAM文件提权4.启动项提权5.不带引号的服务路径提权 1.溢出漏洞提权 溢出提权攻击的基本原理是&#xff0c;通过向目标系统发送过长的输入数据&#xff0c;超出了程序所分配的缓冲区大小&#xff0c;导致溢出。攻击者可以利用…

如何理解BFC、开启BFC、BFC解决哪些问题

1.BFC 概念 BFC 英文名为 Block Formatting Context (块级格式化上下文) 具体可查看 MDN 2.BFC的作用 元素开启BFC后&#xff0c;子元素不会发生margin塌陷问题元素开启BFC后&#xff0c;子元素浮动&#xff0c;元素不发生高度塌陷元素开启BFC后&#xff0c;该元素不被其他元…

2023年中国分子筛稀土催化材料竞争格局及行业市场规模分析[图]

稀土催化材料能够起到提高催化剂热稳定性、催化剂活性、催化剂储氧能力&#xff0c;以及减少贵金属活性组分用量等作用&#xff0c;广泛应用于石油化工、汽车尾气净化、工业废气和人居环境净化、燃料电池等领域。 2015-2023年中国稀土催化材料规模及预测 资料来源&#xff1a;…

基于SSM的失物招领信息交互平台

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

如何用vscode远程连接Linux服务器

文章目录 一、下载所需插件 二、远程连接 三、更改远程服务器名称 一、下载所需插件 打开商店 下载Remote - SSH 下载Remote - SSH扩展包 二、远程连接 点击远程资源管理器 点击SSH旁边的加号 输入&#xff1a;ssh 用户名服务器地址 介绍 第一个是保存到当前用户第二个是保…

2023年中国印花布产量及发展前景分析:数码印花将成为行业趋势[图]

印花布是用坯布印花纸高温印染加工而成&#xff0c;唐宋时期已很盛行&#xff0c;明清时期达到鼎盛。曾深受人们的喜爱&#xff0c;被作为陪嫁被褥、衣服的必备品。印花布上的图案称作花型&#xff0c;瓦栏、花型创意分享平台。 印花布种类 资料来源&#xff1a;共研产业咨询&…

【算法分析与设计】分支限界法(下)

目录 一、最大团问题1.1 问题描述1.2 上界函数1.3 算法思想 二、旅行售货员问题2.1 问题描述2.2 算法描述 三、电路板排列问题3.1 算法描述 四、批处理作业调度问题4.1 问题的描述4.2 限界函数4.3 算法描述 五、小结六、随机化算法 一、最大团问题 1.1 问题描述 给定无向图G(V…

2023年中国智能矿山发展历程及趋势分析:智能矿山健康有序发展[图]

智能矿山系统对矿山生产提质增效的效果已经开始显现&#xff1a;对不合规、有风险的行动进行及时预警&#xff0c;减少安全事故发生概率&#xff0c;避免因停产整顿产生的巨额亏损&#xff1b;精细化管理整个生产流程&#xff0c;避免过往传统粗放的流程导致的浪费&#xff0c;…

2023年中国精准PCI行业发展规模及发展趋势分析:精准PCI日益普及[图]

精准PCI的主要诊断技术包括作为血管内生理学诊断技术的血流储备分数&#xff08;FFR&#xff09;&#xff0c;以及作为成像技术的血管内超声 &#xff08;IVUS&#xff09;及光学相干断层扫描&#xff08;OCT&#xff09;。随着功能性和解剖评估的发展&#xff0c;在精密PCI领…

IDEA启动C:\Users\badboy\.jdks\corretto-17.0.7\bin\java.exe -Xmx700m报错

出现的现象 这里没有记录当时的截图&#xff0c;主要报错如下&#xff1a; C:\Users\badboy.jdks\corretto-17.0.7\bin\java.exe -Xmx700m … Error occurred during initialization of VM Failed setting boot class path. 排查方式 遇到这种问题我首先就是百度&#xff0c;…

14.4 Socket 双向数据通信

所谓双向数据传输指的是客户端与服务端之间可以无差异的实现数据交互&#xff0c;此类功能实现的核心原理是通过创建CreateThread()函数多线程分别接收和发送数据包&#xff0c;这样一旦套接字被建立则两者都可以异步发送消息&#xff0c;本章将实现简单的双向交互功能。 首先…

2023年中国光纤传感器发展历程、需求量及行业市场规模分析[图]

光纤传感器是利用光纤作为媒介&#xff0c;将外界温度、应变等被测量转化为光纤中传输的光波的强度、相位、频率、波长、偏振态等光学信息的部件。光纤传感器由光源、入射光纤、出射光纤、光调制器、光探测器及解调器组成。其基本原理是将光源的光经入射光纤送入调制区&#xf…

嵌入式开发学习之STM32F407点亮LED及J-Link下载(二)

嵌入式开发学习之STM32F407点亮LED及J-Link下载&#xff08;二&#xff09; 开发涉及工具控制端口配置端口的设定与确认端口配置方法实现点亮LED程序下载与仿真 有工程实例&#xff0c;链接在最底部。 开发涉及工具 开发环境&#xff08;IDE&#xff09;&#xff1a;IAR-ARM8…

2023年中国尾气净化催化材料产量、需求量及行业市场规模分析[图]

尾气处理催化单元系由催化剂厂商将以催化材料和活性组分物质为主要组成的催化剂涂覆在蜂窝陶瓷或金属等载体上而成&#xff0c;催化剂则起到处理尾气中有害物质的各类化学反应的关键催化作用&#xff0c;主要由稀土材料、氧化铝材料、贵金属材料等催化材料和增强催化材料性能的…

华为云云耀云服务器L实例评测 | 实例评测使用之硬件参数评测:华为云云耀云服务器下的 Linux 网络监控神器 bmon

华为云云耀云服务器L实例评测 &#xff5c; 实例评测使用之硬件参数评测&#xff1a;华为云云耀云服务器下的 Linux 网络监控神器 bmon 介绍华为云云耀云服务器 华为云云耀云服务器 &#xff08;目前已经全新升级为 华为云云耀云服务器L实例&#xff09; 华为云云耀云服务器是什…

Ubuntu中不能使用ifconfig命令

​ 问题 打开终端使用如下命令不能运行&#xff1a; ifconfig显示如下错误: 解决方法 在VMware中的虚拟机下面打开“编辑虚拟机设置”&#xff0c;或者在已经打开的虚拟机面板上面打开“虚拟机—设置” 选择网络适配器&#xff0c;选择“NAT模式”&#xff0c;没开机的就…

如何使用C/C++刷新在终端上已经打印的内容

写本文的起源是因为在安装一些工具的时候&#xff0c;发现在终端上并行安装的情况下&#xff0c;显示安装信息是会修改之前已经打印出来的内容&#xff0c;这是怎么做到的呢&#xff1f;抱着对这个问题的好奇我进行了一些探索。 终端是如何运行的 首先是最关键的问题&#xf…