【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;
}
相关推荐
程序喵大人37 分钟前
【C++进阶】STL容器与迭代器 - 01 STL 容器先解决元素放在哪里
开发语言·c++·stl
cui_ruicheng1 小时前
Python从入门到实战(十六):多进程编程
开发语言·python
wdfk_prog2 小时前
嵌入式面试真题第 15 题:不可恢复异常后的通用崩溃快照、调用栈保存与离线分析架构
linux·开发语言·面试·架构
晴空了无痕2 小时前
从 Go 基础到 K8s:一条可落地的 Go 服务端成长路线
开发语言·后端·golang·kubernetes
神明不懂浪漫2 小时前
【第五章】Java中的继承与多态
java·开发语言
神州世通3 小时前
解密企业通信安全防线:Avaya Aura 三层安全架构深度解析
开发语言·php
碎光拾影4 小时前
i.MX6ULL时钟系统配置指南
c语言·arm开发·嵌入式硬件
GeekArch4 小时前
第28讲:避坑——AI堆栈分配错误、栈溢出BUG
c语言·人工智能·stm32·mcu·学习·bug
AC赳赳老秦4 小时前
企业工商公开信息采集分析:OpenClaw 批量查询企业工商信息,生成企业画像报告
大数据·开发语言·python·自动化·php·deepseek·openclaw
qq_2518364575 小时前
基于java Web 动漫视频网站毕业论文
java·开发语言·前端