位段 + 枚举 + 联合体讲解
发布日期:2021-05-19 16:31:17 浏览次数:18 分类:精选文章

本文共 2566 字,大约阅读时间需要 8 分钟。

文章目录

前言

本文将介绍位段、枚举和联合体等相关概念,建议读者先熟悉前文内容。

一. 位段

(1). 位段介绍

位段的结构与普通结构类似,但其成员必须是int、unsigned int、signed int、char或unsigned char类型,并带有指定位数的标量。

struct A {    unsigned int a:2;    unsigned int b:5;    unsigned int c:10;    unsigned int d:30;  };

(2). 位段内存分配

#include 
int main() { struct S { char a : 3; char b : 4; char c : 5; char d : 4; }; struct S s = {0}; s.a = 10; s.b = 12; s.c = 3; s.d = 4; printf("%d\n", s); printf("%d\n", sizeof(s));}

位段的内存分配基于需要,整字节对齐,padding到最接近的字节边界。

(3). 位段的局限性

  • 符号性难以确定
  • 位数固定,需考虑平台兼容性
  • 内存分配模式不统一
  • 跨字段结构分配时易导致位数丢失

(4). 练习题解答

(1)

#define MAX_SIZE A+Bstruct _Record_Struct {  unsigned char Env_Alarm_ID : 4;  unsigned char Para1 : 2;  unsigned char state;  unsigned char avail : 1;}*Env_Alarm_Record;struct _Record_Struct *pointer = (struct _Record_Struct*)malloc(sizeof(struct _Record_Struct) * MAX_SIZE);

计算结果:sizeof(struct _Record_Struct)=3,总空间为9

(2)

#include 
int main() { unsigned char puc[4]; struct tagPIM { unsigned char ucPim1; unsigned char ucData0 : 1; unsigned char ucData1 : 2; unsigned char ucData2 : 3; }*pstPimData; pstPimData = (struct tagPIM*)puc; memset(puc,0,4); pstPimData->ucPim1 = 2; pstPimData->ucData0 = 3; pstPimData->ucData1 = 4; pstPimData->ucData2 = 5; printf("%02x %02x %02x %02x\n",puc[0], puc[1], puc[2], puc[3]); return 0;}

打印结果:02 29 00 00

二. 枚举

枚举类型用于定义一系列取值,通常用于常量表示。默认取值从0开始,但可自定义初始值。

enum Day    {Mon, Tues, Wed, Thur, Fri, Sat, Sun};enum Sex    {MALE, FEMALE};enum Color    {RED=1, GREEN=2, BLUE=4};

三. 联合体

(1). 联合体介绍

联合体变量包含多个成员,共用同一块内存空间。

union Un {  char c;  int i;};union Un un;printf("%p\n", (void*)un.i);printf("%p\n", (void*)un.c);un.i = 0x11223344;un.c = 0x55;printf("%x\n", un.i);

打印结果:11223355

(2). 联合体计算

union Un1 {  char c[5];  int i;};union Un2 {  short c[7];  int i;};printf("%d\n", sizeof(union Un1)); // 8printf("%d\n", sizeof(union Un2)); // 16

(3) 例子解析

#include 
union Un { short k; char i[2];} *s, a;s = &a;s->i[0] = 0x39;s->i[1] = 0x38;printf("%x\n", a.k);

打印结果:3839

上一篇:动态内存分配(malloc,calloc,realloc)和柔性数组
下一篇:结构体及结构体内存对齐讲解

发表评论

最新留言

路过按个爪印,很不错,赞一个!
[***.219.124.196]2025年05月01日 11时39分59秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

10个高级的 SQL 查询技巧,你掌握了几个? 2023-01-24
ELK原理与介绍(转) 2023-01-24
ELK学习笔记(三)单台服务器多节点部署 2023-01-24
ELK应用日志收集实战 2023-01-24
elTable火狐浏览器换行 2023-01-24
15个Python数据处理技巧(非常详细)零基础入门到精通,收藏这一篇就够了 2023-01-24
2023年深信服、奇安信、360等大厂网络安全校招面试真题合集(附答案),让你面试轻松无压力! 2023-01-24
2024年全国程序员平均薪资排名:同样是程序员,为什么差这么多?零基础到精通,收藏这篇就够了 2023-01-24
0基础成功转行网络安全工程师,年薪30W+,经验总结都在这(建议收藏) 2023-01-24
100个电脑常用组合键大全(非常详细)零基础入门到精通,收藏这篇就够了 2023-01-24
10个程序员可以接私活的平台 2023-01-24
10个程序员可以接私活的平台(非常详细)零基础入门到精通,收藏这篇就够了 2023-01-24
10个运维拿来就用的 Shell 脚本,用了才知道有多爽,零基础入门到精通,收藏这一篇就够了 2023-01-24
10条sql语句优化的建议 2023-01-24
10款宝藏编程工具!新手必备,大牛强烈推荐! 从零基础到精通,收藏这篇就够了! 2023-01-24
10款最佳免费WiFi黑客工具(附传送门)零基础入门到精通,收藏这一篇就够了 2023-01-24
15个Python数据分析实用技巧(非常详细)零基础入门到精通,收藏这一篇就够了 2023-01-24
15个备受欢迎的嵌入式GUI库,从零基础到精通,收藏这篇就够了! 2023-01-24
15个程序员常逛的宝藏网站!!从零基础到精通,收藏这篇就够了! 2023-01-24
1分钟学会在Linux下模拟网络延迟 2023-01-24