sizeof 算结构体大小,为什么结果总是比我算的大?
一个让我愣住的 sizeof今天晚上继续磕学生管理系统。前面用数组分别存姓名、成绩、年龄搞得我每次改学生信息都要同时操作三个数组代码又臭又长。我就想就不能把跟一个学生相关的所有信息打包在一起吗查了一下C 语言里果然有个东西叫结构体struct专门干这个事。我兴奋地写了第一个结构体定义了一个student类型struct student { char name[20]; // 名字20字节 int age; // 年龄4字节 float score; // 分数4字节 };然后我顺手用sizeof(struct student)看了一下这个类型占多大空间。心里的小算盘打得啪啪响20 4 4 28 字节。结果一跑输出 28运气好还真是 28——但如果我换个成员顺序结果就变了。我当时就愣住了这又不是四则运算怎么换顺序还影响结果后来才知道这不是 C 语言 bug是一个叫结构体对齐的东西在作祟。这是今天花最长时间搞明白的事。先搞清楚结构体到底是什么在这之前先把结构体本身理清楚。int存整数char存字符这些是 C 语言给的基本类型。但真实世界里的数据从来不是一个一个独立存在的——一个学生同时有名字、年龄、成绩你要是还像之前那样用三个数组去存它们之间的联系全靠同一个下标硬撑着。结构体干的事就是自己造一个新的数据类型把要用的成员打包在一起。语法长这样struct 结构体名 { 成员列表; }; // 这个分号千万别忘忘了我已经替你试过了编译器报错能看哭你造好了类型之后用法跟int那种基本类型一样——可以定义变量、数组、指针还能当函数参数和返回值。下面对比一下int a; // 定义一个整数变量开了4字节空间 struct student s; // 定义一个学生变量开多大空间这就是前面的问题了定义变量的本质就是开空间所以空间到底多大自然就成了第一个绕不开的问题。初始化、点运算符和箭头运算符这些倒不复杂初始化就按成员顺序挨个给值struct student s {tom, 18, 99.5}; // 按 name, age, score 顺序来访问成员用.运算符s.name // 访问名字 s.age // 访问年龄 s.score // 访问分数如果用到指针用-运算符更清爽struct student *p s; p-name // 等价于 (*p).name但少打两个字符你懂的有个挺方便的小细节同类型的结构体变量可以直接用赋值成员会逐个拷贝过去不用自己写循环struct student s1 {tom, 18, 99.5}; struct student s2 s1; // 爽一行搞定不过函数传参时要注意一般传地址而不是传结构体本身。你想想一个结构体可能几十上百字节如果传值就会把整个结构体复制一份传给函数浪费时间和栈空间没必要。回到那个让我纠结了一晚上的对齐问题好现在回到开头那个让我怀疑人生的问题为什么sizeof(struct student)不一定等于成员大小加起来我把 student 结构体里的成员换了个顺序来试struct demo { char a; // 1字节 int b; // 4字节 char c; // 1字节 }; // 我心算1 4 1 6 字节 // 实际输出12 字节。喂不是编译器出 bug是 CPU 本身就不喜欢非对齐的数据。32 位 CPU 一次读 4 个字节如果数据没有放在“自然边界”上CPU 可能要多读一次才能完整取出数据。编译器为了性能就自动帮我们做内存对齐。规则分两步第一步每个成员要站在自己的自然边界上。什么叫自然边界就是成员类型大小对应的地址要求char—— 1 字节对齐随意放short—— 2 字节对齐地址必须能被 2 整除int/long/float—— 4 字节对齐地址必须能被 4 整除double—— 8 字节对齐地址必须能被 8 整除。回头看我那个demo结构体char a从地址 0 开始占 1 字节下一个是int b它要求地址必须是 4 的倍数所以地址 1、2、3 都满足不了编译器直接跳过 3 个字节让b从地址 4 开始。然后char c从地址 8 开始。第二步整个结构体的大小要跟最大成员对齐。int b是 4 字节对齐所以整个结构体的大小必须是 4 的整数倍。目前 a(1) 填充(3) b(4) c(1) 9 字节9 不是 4 的倍数编译器又在最后补了 3 字节凑成 12。总的来说结构体大小不是简单把成员大小相加编译器会在成员之间和末尾偷偷塞“填充字节”让每个成员站在自己的自然边界上。听起来很烦但本质上是在帮 CPU 跑得更快。共用体同一个房间不同时间段住不同的人结构体是每个成员各有各的房间共用体union是所有成员轮流用同一间房。语法跟结构体差不多union demo { int a; // 4字节 float b; // 4字节 char c; // 1字节 }; // 三个变量共用一块空间空间大小取最大的那个成员——也就是4字节初始化时只能给一个值默认给第一个成员union demo d {10}; // 给第一个成员 a 赋值为 10这里有个容易踩的坑如果你给d.a 100;然后再给d.c A;那d.a的值就没了——大家住同一间房后面住进来的人会把前面的人的东西清出去。共用体一个经典的用法是测试电脑是大端还是小端union test { int a; char b; }; union test t; t.a 1; // int 和 char 的起始地址相同b 读到的是 a 的最低字节 if (t.b 1) { printf(小端模式\n); // 低位在低地址 } else { printf(大端模式\n); // 低位在高地址 }还有一个实用场景学生有score老师有salary但同一个人不可能同时是学生又是老师所以这俩字段不用同时存在struct member { char name[20]; int age; union { float score; // 学生用 float salary; // 老师用 } data; }; // 省下了一个 float 的空间枚举给那些只有几种可能值的变量正经起个名如果一个变量取值就那么几种比如交通信号灯就红、绿、黄三种。你用0、1、2去代表过两周回来看代码满脑子问号0 是啥意思来着红灯还是绿灯枚举就是来解决这个的enum light { RED, // 默认从 0 开始 GREEN, // 自动 1 YELLOW // 自动 2 };好处很明显代码可读性直接提升一个档次看到RED就知道是红灯不用猜数字。还可以自己指定起始值enum light { RED 10, GREEN, // 接着变成 11 YELLOW // 接着变成 12 };枚举本质是int类型但它跟宏定义比起来有个很大优势枚举是正儿八经的类型编译阶段发挥作用有类型检查宏呢只是预处理阶段做文本替换没有任何类型概念出错了编译器连个像样的提示都给不了。今天容易搞混的几个点容易搞混的情况为什么容易错结构体大小直接用成员大小加编译器会做内存对齐成员之间和末尾可能有填充字节换一下成员顺序结果就可能不一样结构体传参直接传变量本身值传递会把整个结构体复制一份大的结构体浪费栈空间还慢传地址更高效共用体当成结构体来用以为各存各的共用体所有成员共用一块内存给第二个成员赋值会把第一个成员的值覆盖掉共用体大小以为是所有成员之和共用体大小等于最大成员的大小不是加起来的别跟结构体搞混枚举和宏定义混着用感觉差不多枚举有类型检查编译阶段生效宏只是预处理文本替换没有类型概念调试起来更痛苦结构体定义最后忘写分号};这个分号一漏编译器报一堆莫名其妙的错一开始看会特别懵今日学习感悟今天花时间最多的不是写代码是搞清楚 sizeof 为啥对不上我口算的结果。刚开始觉得对齐就是编译器在折磨我后来理解了 CPU 读内存的方式才觉得它确实是在帮我们做优化。结构体、共用体、枚举其实都是在解决同一个问题怎么把数据组织得更合理。用数组硬撑确实能跑但写到后面就知道痛苦了。慢慢开始体会到好的数据结构比多写几行代码重要得多。Day15 学习记录明天继续。

相关新闻

QWENPAW 本地部署实战:结合免费模型配置实现零成本运行

QWENPAW 本地部署实战:结合免费模型配置实现零成本运行

本文介绍 QWENPAW 的本地部署流程,并详细讲解如何配置免费模型(如 Qwen 系列开源权重或 Ollama 托管的轻量模型),通过代码示例与注意事项,帮助读者快速搭建可用环境。 标签:QWENPAW、Ollama、本地部署、免费…

2026/8/1 2:28:42 阅读更多 →
ADC前端滤波电容选型误区:大电容为何导致采样失真?

ADC前端滤波电容选型误区:大电容为何导致采样失真?

这次我们来看一个在嵌入式开发和信号采集领域非常普遍,但又容易被误解的问题:ADC(模数转换器)前端的滤波电容,是不是越大越好?很多工程师在设计电路时,会下意识地认为更大的滤波电容能带来更纯净…

2026/8/1 2:28:42 阅读更多 →
Linux权限管理完全指南

Linux权限管理完全指南

1. 用户与权限的基本概念在 Linux 系统中,每个文件和目录都属于一个用户(owner)和一个用户组(group)。权限就是对这三类身份分别设定的:用户(user / owner):文件的拥有者…

2026/8/1 2:28:42 阅读更多 →

最新新闻

最少转弯路径算法:从BFS到0-1 BFS与Dijkstra的优化实践

最少转弯路径算法:从BFS到0-1 BFS与Dijkstra的优化实践

1. 问题引入:从地图导航到算法核心最近在复盘一些经典的图论与搜索问题时,我又把“最少转弯问题”(Minimum Turns Problem)拿出来琢磨了一番。这个问题听起来很直白:在一个二维网格(比如城市地图、游戏地图…

2026/8/1 3:12:57 阅读更多 →
51单片机定时器/计数器原理与应用:从精准定时到事件计数

51单片机定时器/计数器原理与应用:从精准定时到事件计数

1. 从“跑马灯”到“精准时钟”:为什么51单片机的定时器/计数器是灵魂如果你刚开始玩51单片机,可能第一个程序就是点亮一个LED,或者做个跑马灯。用while循环加_nop_()空操作指令来延时,是很多人的入门操作。但当你试图让两个LED以…

2026/8/1 3:12:57 阅读更多 →
51单片机电子钟开发实战:LCD1602显示+定时器中断+按键控制完整实现

51单片机电子钟开发实战:LCD1602显示+定时器中断+按键控制完整实现

51单片机电子钟实战教程:LCD1602显示整点报时闹钟功能完整实现在实际的单片机学习过程中,电子钟项目是一个综合性很强的实践案例,它涵盖了定时器中断、LCD显示、按键处理、蜂鸣器控制等多个核心知识点。很多初学者在独立完成电子钟项目时&…

2026/8/1 3:12:57 阅读更多 →
Moneta亿汇:外汇领域风控思路与技术架构如何影响体验,给出一套细节

Moneta亿汇:外汇领域风控思路与技术架构如何影响体验,给出一套细节

在外汇行业语境里,表达越清晰、信息越透明,越容易建立稳定预期。在Moneta亿汇的外汇服务中,从公开信息与使用体验出发,梳理其更值得肯定的能力点与细节表现。外汇相关信息更新频繁,平台将关键提示与解释呈现得更清晰&a…

2026/8/1 3:12:57 阅读更多 →
AI生成科技感背景:为什么你的输出总像“PPT特效”?揭秘底层纹理频率分布与人类视觉感知阈值匹配公式

AI生成科技感背景:为什么你的输出总像“PPT特效”?揭秘底层纹理频率分布与人类视觉感知阈值匹配公式

更多请点击: https://intelliparadigm.com 第一章:AI生成科技感背景 在现代网页设计与数字内容创作中,AI生成的科技感背景已成为提升视觉专业度的关键元素。这类背景通常融合深空蓝、霓虹紫、粒子光效与动态网格线,既体现技术前沿…

2026/8/1 3:12:57 阅读更多 →
51单片机程控放大器系统设计:AD603与LCD1602实战指南

51单片机程控放大器系统设计:AD603与LCD1602实战指南

51单片机程控放大器系统设计与实现(LCD1602显示)在实际的电子测量和信号处理系统中,经常需要对不同幅度的信号进行放大处理。传统的手动调节放大器存在精度低、响应慢的问题,而基于51单片机的程控放大器系统能够实现精确的数字化控…

2026/8/1 3:11:57 阅读更多 →

日新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/1 0:00:48 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/1 0:00:48 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/1 0:00:48 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/31 1:03:03 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/29 14:34:28 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/31 4:19:39 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/1 0:00:48 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/1 0:00:48 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/1 0:00:48 阅读更多 →