Z
ZHANK
结构体与内存

结构体高级

结构体数组、嵌套结构体、内存对齐与填充、位域

结构体高级

结构体不只存数据——它们互相嵌套、用位域压缩存储、在内存中有对齐规则。

学完本章你将: 掌握结构体数组、嵌套、内存对齐/填充、位域。


结构体数组

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