402 字
1 分钟
【C】结构体联合体与枚举
2026-05-19

结构体#

struct Point {
int x;
int y;
};
struct Point p = {1, 2};
struct Point *pp = &p;
pp->x = 3; // 等价于 (*pp).x

内存对齐#

为提高访问效率,成员按对齐要求排列,可能插入填充字节。

规则(简化):

  1. 结构体起始地址对齐到其最严格成员的对齐要求
  2. 每个成员偏移量为其自身大小的整数倍(对齐倍数)
  3. 结构体总大小为最大成员对齐值的整数倍(末尾可能填充)
  4. 嵌套结构体按自身最大对齐要求参与外层布局

可用 offsetofsizeof 在目标平台上验证布局。

位域#

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结构体联合体与枚举/
作者
Sekiro
发布于
2026-05-19
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时

目录