【C语言】【结构体的位段】位段的内存分配及注意事项

1.什么是位段:

c 复制代码
struct A
{
int _a:2;
int _b:5;
int _c:10;
int _d:30;
};

1.A就是一个位段类型的变量,位表示比特位,意思是 A中的变量申请内存的比特位数

比如 _a要占 2 个bit

2.位段的成员必须是 int ,unsigned int ,signed int 类型的,在C99中段位成员可以有 char类型的。

2.段位中的内存分配:

c 复制代码
#include<stdio.h>
struct A
{
	int _a : 2;
	int _b : 5;
	int _c : 10;
	int _d : 30;
};
int main()
{
	printf("%d", sizeof(struct A));
}

位段的空间上是按照需要以4个字节( int )或者1个字节( char )的⽅式来开辟的。

而且是先把十进制转化为二进制,再根据申请的bit数从低位截断后进行存储的,当开辟的8个bit位剩余空间不够存下一个时,再开辟下一个内存空间(8bit)

3.位段使用注意事项:

内存中,每个字节分配一份空间,而位段中的成员可能并不是每个都独自占 1 个字节的空间,所以直接取某个成员的地址是没有意义的,一个字节内部的bit 位是没有地址的

错误写法:

正确写法:

c 复制代码
#include<stdio.h>
struct A
{
	int _a : 2;
	int _b : 5;
	int _c : 10;
	int _d : 30;
};
int main()
{
	struct A a = { 0 };
	int b = 0;
	scanf("%d", &b);
	a._b = b;
	return 0;
}
相关推荐
clz13145212 分钟前
设备反欺诈的四大支柱:从设备指纹到关联图谱
开发语言·php
clear sky .23 分钟前
内存8字节对齐是什么?
c语言·stm32·嵌入式硬件
疯狂打码的少年23 分钟前
【计算机网络】IP地址与子网划分(IP地址分类与特殊地址)
网络·笔记·tcp/ip·计算机网络
CappuccinoRose26 分钟前
专项事件体系
前端·学习·网络状态·表单事件·剪贴板事件·拖放事件·页面可见性
bessyon28 分钟前
从设备自购看医美机构的运营逻辑与竞争壁垒
笔记
无忧.芙桃30 分钟前
C++内存管理
c语言·开发语言·c++·青少年编程
(Charon)30 分钟前
【Kafka】消息队列学习(一):为什么需要Kafka?从消息队列到整体架构
学习·架构·kafka
Patrick在香港32 分钟前
Python 分析香港 AQHI 归档 1644 天:同一天的空气,早上 8 点报 3,下午 5 点报 10
开发语言·python·数据分析·api·restful·数据可视化·开放数据
晴天1634 分钟前
JavaScript 与 Java 垃圾回收机制对比
java·开发语言·javascript
金金计较.36 分钟前
Go语言-2
开发语言·算法·golang