结构体高级
结构体数组、嵌套结构体、内存对齐与填充、位域
结构体高级
结构体不只存数据——它们互相嵌套、用位域压缩存储、在内存中有对齐规则。
学完本章你将: 掌握结构体数组、嵌套、内存对齐/填充、位域。
结构体数组
c
#include <stdio.h>
typedef struct {
int id;
char name[20];
float score;
} Student;
int main() {
Student class[3] = {
{1, "小明", 92.5},
{2, "小红", 88.0},
{3, "小刚", 95.0},
};
for (int i = 0; i < 3; i++) {
printf("学号:%d,姓名:%s,成绩:%.1f\n",
class[i].id, class[i].name, class[i].score);
}
return 0;
}
嵌套结构体
c
typedef struct {
int day, month, year;
} Date;
typedef struct {
int id;
char name[20];
Date birthday; // 嵌套
} Student;
// 访问:stu.birthday.year
内存对齐 —— sizeof 的隐藏坑
c
#include <stdio.h>
typedef struct {
char a; // 1 字节
int b; // 4 字节
char c; // 1 字节
} Bad;
typedef struct {
int b; // 4 字节
char a; // 1 字节
char c; // 1 字节
} Good;
int main() {
printf("Bad : %zu\n", sizeof(Bad)); // 可能 = 12
printf("Good : %zu\n", sizeof(Good)); // 可能 = 8
return 0;
}
⚠️ 编译器为了性能会对齐成员地址,导致结构体中有"空洞"(padding)。把大成员放前面可以减少浪费。
位域 —— 按位压缩
c
typedef struct {
unsigned int flag : 1; // 占 1 位
unsigned int type : 3; // 占 3 位(0-7)
unsigned int perm : 2; // 占 2 位(0-3)
} Flags;
// 整个结构可能只占 1 个 int