1. 为什么C语言自定义类型值得花3分钟吃透?
在嵌入式开发、操作系统内核、通信协议等底层领域,C语言自定义类型的使用频率高得惊人。我曾在一次内存优化项目中,仅通过合理使用共用体就节省了40%的内存空间。结构体、共用体、枚举这三种看似简单的类型,实则是C语言高效编程的三大法宝。
结构体(struct)允许你将不同类型的数据打包成一个整体,共用体(union)让多个变量共享同一块内存,枚举(enum)则为整数值赋予有意义的名称。这三种类型配合使用,既能提升代码可读性,又能实现精妙的内存管理。比如网络协议栈开发中,结构体常用于定义数据包格式,共用体用于协议字段的灵活解析,而枚举则用来表示各种状态码。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 结构体:数据打包的艺术
2.1 基础定义与内存布局
结构体的定义语法看似简单,但细节决定成败:
c复制struct student {
char name[20]; // 姓名
int id; // 学号
float score; // 成绩
}; // 注意这个分号不能少
在32位系统中,这个结构体占用的内存不是简单的20+4+4=28字节。由于内存对齐原则,实际大小可能是32字节。通过#pragma pack(1)可以取消对齐优化,但会降低CPU访问效率。
经验:在内存紧张的嵌入式系统中,合理排列结构体成员顺序可以节省内存。将大的基本类型放在前面,小的放在后面。
2.2 高级用法:位域与柔性数组
结构体位域在协议开发中特别有用:
c复制struct protocol {
unsigned int type:4; // 使用4位表示类型
unsigned int flag:1; // 1位标志位
unsigned int len:27; // 27位表示长度
};
柔性数组则是动态大小结构体的解决方案:
c复制struct dynamic_buffer {
int len;
char data[]; // 必须是最后一个成员
};
3. 共用体:内存共享的魔法
3.1 基础概念与典型应用
共用体的所有成员共享同一块内存,大小由最大成员决定:
code复制
