资讯动态

C语言结构体详解|结构体定义、变量初始化、内存对齐

发布时间:2026/10/26 18:20:34 来源:尧图企业网站定制
前言我们之前学的char、int、float这些都是基础类型一个变量只能存一个数据。 但现实里很多东西是一组相关数据比如学生姓名、年龄、学号、分数。 单独用好几个零散变量存很麻烦结构体struct就是用来把一堆不同类型的数据打包在一起的自定义类型。一、结构体类型怎么定义语法格式struct 结构体名 { 成员1; 成员2; 成员3; };举个学生的例子// 定义一个学生结构体类型 struct Student { char name[20]; // 姓名 int age; // 年龄 float score; // 分数 };注意上面这段代码只是创建了一个新类型没有开辟内存没有变量就像是图纸不是房子。二、结构体变量的创建和初始化方式1定义结构体之后单独创建变量struct Student s1; // 初始化 struct Student s2 {zhangsan, 18, 92.5f};方式2定义结构体的同时直接创建变量struct Student { char name[20]; int age; float score; } s3, s4; // s3 s4 就是结构体变量方式3匿名结构体没有结构体名字只能在这里直接创建变量后面不能再新建这个类型的变量struct { int a; char b; } data;访问结构体成员.点操作符#include stdio.h struct Student { char name[20]; int age; float score; }; int main() { struct Student s {lisi, 19, 88.0f}; printf(名字%s 年龄%d 分数%.1f\n, s.name, s.age, s.score); return 0; }运行结果名字lisi 年龄19 分数88.0如果是结构体指针就用-箭头访问成员这个后面再拓展本篇重点是内存对齐。三、重点结构体内存对齐很多人以为结构体大小 所有成员大小直接相加这个想法是错的CPU读取内存的时候喜欢按固定块读取对齐就是为了提升读取效率代价是浪费一点点空间填充空白字节叫填充/补齐padding。内存对齐三条核心规则记住这三条就够结构体第一个成员放在偏移0的位置最开头后面每个成员要对齐到自身大小和默认对齐数里较小值的整数倍地址结构体的总大小必须是结构体最大成员大小的整数倍不够就在末尾补paddingVS默认对齐数是8Linux gcc默认对齐数也是8例子1简单结构体画图讲解struct Test1 { char c; // 1字节 int i; // 4字节 };我们来一步步算画内存格子一个格子代表1字节地址 0 1 2 3 4 5 6 7 数据[c] 空 空 空 [i0][i1][i2][i3]c放在0号地址占1字节int占4字节它要放在4的倍数地址下一个可用地址是1不是4倍数所以1、2、3填充空白paddingi从地址4开始占4字节到7结束最大成员是int4字节总大小要4的倍数现在一共8字节刚好满足sizeof(struct Test1) 8不是 145代码验证#include stdio.h struct Test1 { char c; int i; }; int main() { printf(%zd\n, sizeof(struct Test1)); // 输出 8 return 0; }例子2换一下成员顺序大小直接变了struct Test2 { int i; // 4字节 char c; // 1字节 };内存排布地址 0 1 2 3 4 5 6 7 数据[i0][i1][i2][i3] [c] 空 空 空int从0开始占0~3char放地址4占1字节最大成员是4字节总大小必须是4倍数现在5字节后面补3个空字节凑到8sizeof(struct Test2) 8小结论调整成员顺序可以减少内存浪费例子3再复杂一点的组合struct Test3 { char a; // 1 short b; // 2 int c; // 4 };内存排布0:[a] 1:空 2:[b0][b1] 4:[c0][c1][c2][c3]a在0short是2字节要放到2的倍数地址地址1不行地址2可以1位置补paddingint放到4的倍数地址4总大小8刚好是最大成员4的倍数 ✅ sizeof 8 总和直接相加 1247对齐之后变成8例子4嵌套结构体对齐拓展了解规则不变嵌套的结构体对齐数取它内部最大成员的大小struct Inner { char ch; int num; }; struct Outer { char x; struct Inner in; };Inner大小是8Inner最大成员是4。 in成员要对齐到4的倍数地址。 x在01、2、3补paddingin从4开始放总大小 4812。四、修改默认对齐数#pragma pack我们可以手动改对齐数用来省空间在一些硬件开发里经常用到。#pragma pack(1) // 设置对齐数为1关闭对齐不补padding struct Test { char c; int i; }; #pragma pack() // 恢复默认对齐pack(1)的时候上面这个结构体大小就是5不会补空字节。 不推荐随便改会降低CPU访问速度只有特殊场景才用。五、小结struct结构体是C给我们自定义打包数据的工具把一堆不同类型成员放一起。结构体变量创建有三种写法.访问成员指针用-。结构体大小不能直接成员相加要遵守三条对齐规则中间和末尾会填充空白字节padding。成员顺序会影响结构体占用内存大小合理排序可以节省内存。#pragma pack可以修改对齐数慎用。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑