402 字
1 分钟
【C】结构体联合体与枚举
结构体
struct Point { int x; int y;};
struct Point p = {1, 2};struct Point *pp = &p;pp->x = 3; // 等价于 (*pp).x内存对齐
为提高访问效率,成员按对齐要求排列,可能插入填充字节。
规则(简化):
- 结构体起始地址对齐到其最严格成员的对齐要求
- 每个成员偏移量为其自身大小的整数倍(对齐倍数)
- 结构体总大小为最大成员对齐值的整数倍(末尾可能填充)
- 嵌套结构体按自身最大对齐要求参与外层布局
可用 offsetof、sizeof 在目标平台上验证布局。
位域
见 14-位域。
联合体(union)
union Data { int i; float f; char str[20];};- 所有成员共享同一块内存,同一时刻只应把其中一个成员当作「活跃」成员使用
- 大小一般为最大成员的大小(含对齐填充)
- 给某一成员赋值后,再按另一成员类型读取属于未定义行为(除非是无类型内存拷贝等特殊情况)
- 常用于节省内存、协议字段复用、类型双关(需注意严格别名规则)
枚举(enum)
enum Color { RED, // 0 GREEN, // 1 BLUE // 2};
enum State { OFF = 0, ON = 1, ERROR = 100, WARN // 101,依次递增};- 枚举常量在 C 中类型为
int,可参与整数运算 - 默认从 0 递增;可显式指定某一常量的值,其后继续递增
- 提高可读性,比宏更易调试
typedef
为已有类型创建别名:
typedef unsigned int uint;typedef struct Node Node;| 对比项 | typedef | #define |
|---|---|---|
| 处理阶段 | 编译器 | 预处理器 |
| 类型检查 | 有 | 无(文本替换) |
| 复杂类型 | 适合 | 不适合 |
头文件中常用 typedef 简化 struct 用法。
分享
如果这篇文章对你有帮助,欢迎分享给更多人!
【C】结构体联合体与枚举
https://lysj.work/posts/studynotes/c/c结构体联合体与枚举/ 部分信息可能已经过时
相关文章 智能推荐
