1. C语言结构体深度解析
结构体是C语言中最重要的复合数据类型之一,它允许我们将不同类型的数据组合成一个有机整体。在实际开发中,结构体常用于表示复杂的数据实体,比如学生信息、商品属性、图形坐标等。
1.1 结构体的基本定义
结构体定义的基本语法如下:
c复制struct 结构体标签 {
数据类型 成员1;
数据类型 成员2;
...
} 变量列表;
例如定义一个表示学生的结构体:
c复制struct Student {
char name[20]; // 姓名
int age; // 年龄
float score; // 成绩
};
这里有几个关键点需要注意:
struct是定义结构体的关键字Student是结构体标签,可以省略(定义匿名结构体)- 结构体成员可以是任意合法的C数据类型
- 末尾的分号不能省略
1.2 结构体变量的声明和初始化
声明结构体变量有几种方式:
- 先定义结构体类型,再声明变量:
c复制struct Student stu1, stu2;
- 定义结构体类型的同时声明变量:
c复制struct Student {
char name[20];
int age;
} stu1, stu2;
- 使用typedef定义结构体类型别名:
c复制typedef struct {
char name[20];
int age;
} Student;
Student stu1, stu2; // 无需再写struct关键字
结构体变量初始化可以使用以下方式:
c复制struct Student stu1 = {"张三", 18, 90.5};
或者指定成员初始化:
c复制struct Student stu1 = {
.name = "李四",
.age = 20,
.score = 85.0
};
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 结构体的内存布局与对齐
2.1 结构体大小计算
结构体的大小并不简单等于各成员大小之和,因为存在内存对齐的问题。计算结构体大小时需要考虑以下对齐规则:
- 结构体第一个成员的偏移量为0
- 每个成员的偏移量必须是其类型大小的整数倍
- 结构体总大小必须是最大成员大小的整数倍
例如:
c复制struct Example {
char a; // 1字节
int b; // 4字节
double c; // 8字节
short d; // 2字节
};
这个结构体的实际内存布局如下:
code复制| char a (1) | 填充3字节 | int b (4) | double c (8) | short d (2) | 填充6字节 |
总大小为24字节,而不是简单的1+4+8+2=15字节。
2.2 结构体对齐的控制
我们可以使用预处
