【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;
}
相关推荐
2601_9669496526 分钟前
如何根据研究的起止时间截取分钟级行情?Python 实战与 QuantDash 数据处理指南
开发语言·python·pandas·量化交易·1024程序员节·股票数据·quantdash
晨曦中的暮雨2 小时前
限流算法——固定窗口、滑动窗口、漏桶、令牌桶
java·开发语言·算法
喵了几个咪3 小时前
GoWind CMS 拆解:在 Go 里给 TipTap 搭一套 Yjs 协同后端
开发语言·后端·golang
程序员清风3 小时前
数据处理脚本工程化:日志、配置、命令行与测试
服务器·开发语言·数据库
学长毕设4 小时前
基于SpringBoot的青少年编程学习平台系统-附源码
spring boot·学习·青少年编程
2601_962885725 小时前
如何用 Python 把 K 线重采样成任意周期?
开发语言·python
Wang's Blog5 小时前
Java 项目实战: 交友项目 - 圈子功能实现:总结
java·开发语言·交友
下一站春风里6 小时前
位运算完整学习笔记:按位与(&)+ 异或(^)
开发语言·c++·算法
天外飞雨道沧桑7 小时前
我在浏览器里练了一个 792 参数的大模型,它学会了补全 JavaScript
开发语言·javascript·ai·ecmascript·ai编程
hhhjhl7 小时前
Yup 跨端三方库仓颉适配全流程
java·开发语言