自定义类型(结构体,结构体的存储大小如何计算)

简介: 结构:是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。结构体定义由关键字 struct和结构体名组成,结构体名可以根据需要自行定义。其中的struct是定义结构体类型的关键字(必须要写);Stu是当前结构体的字名(可以不写);大括号里面的age,name是成员变量。


当我们想在C语言中定义一个学生类型时就会发现如果用char,int等基础的数据类型来定义的话就实现不了,因为一个学生类型会有学号,姓名……而此时就会用到C语言中的自定义类型中的结构体了。

什么是结构体:

结构:是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。

结构体定义由关键字 struct和结构体名组成,结构体名可以根据需要自行定义。

如何声明结构体:

例如你想要定义一个学生类型就可以写成:

structStu{
intage;
charname[10];
};

image.gif

其中的struct是定义结构体类型的关键字 (必须要写);

Stu是当前结构体的字名(可以不写);

大括号里面的age,name是成员变量


结构体的定义:

一种就是和普通变量一样定义比如变量a:

structStu{
intage;
charname[10];
};
intmain()
{
structStua= {18, "zhangsan"};
return0;
}

image.gif

还有一种就是在声明结构体时就定义比如s1(这种方法定义的结构体变量它的生存周期和该结构体类型相同) 如果没有写结构体的名字那么就只能用这种方法才能定义该类型的变量如s2:

structStu{
intage;
charname[10];
}s1;
struct{
intage;
charname[10];
}s2;

image.gif

如何计算结构体类型的大小?

我们就用上面的那个结构体来举例子,下面这幅图画的应该就是我们最容易想到的然后我们就会得出这个类型的大小为4+10=14个字节


image.png

可是我们用sizeof进行计算之后发现并不是这样真正的结果是16;

image.png

那么我们为了可以得到结构体成员变量在内存中的存储的相对位置就需要使用offsetof它可以计算结构体成员相较于结构体起始位置的偏移量, 它不是函数是宏

例一:

image.png

例二:

image.png

从这两个例子就可以看出结构体成员变量在内存中并不是连续存储的。

而这被称为:

结构体内存对齐

对齐规则:

  1. 第一个成员在与结构体变量偏移量为0的地址处。
  2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。 对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。 VS中默认的值为8 ;Linux中没有默认对齐数,对齐数就是成员自身的大小
  3. 结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍。
  4. 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整 体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。

现在就可以根据规则对对上面两个例子进行解释了

例一:

image.png

age的偏移量为0,name的类型是char所以紧接着存储,但是整个结构体类型的大小因为14不是4(因为int的大小为4字节)的倍数所以要浪费两个字节变为16个字节。而跟据对齐规则也可以算出例二的大小

例二:

image.png

image.png

目录
相关文章
|
机器人 Shell 开发者
ROS2教程08 ROS2的功能包、依赖管理、工作空间配置与编译
这篇文章是关于ROS2(Robot Operating System 2)中功能包、依赖管理、工作空间配置和编译的教程,涵盖了ROS2工作空间的概念、如何获取和安装功能包的依赖、构建工作空间的步骤,以及如何创建和管理ROS2功能包,包括使用命令行工具对功能包进行操作的方法。
3362 0
ROS2教程08 ROS2的功能包、依赖管理、工作空间配置与编译
|
负载均衡 数据库连接 API
什么是HTTP 500错误,怎么解决
什么是HTTP 500错误,怎么解决
12671 0
|
Python
python-------pyinstaller打包pygame游戏或单个、多个.py文件成.exe文件
python-------pyinstaller打包pygame游戏或单个、多个.py文件成.exe文件
1577 0
python-------pyinstaller打包pygame游戏或单个、多个.py文件成.exe文件
|
1天前
|
人工智能 JSON 供应链
畅用7个月无影 JVS Claw |手把手教你把JVS改造成「科研与产业地理情报可视化大师」
LucianaiB分享零成本畅用JVS Claw教程(学生认证享7个月使用权),并开源GeoMind项目——将JVS改造为科研与产业地理情报可视化AI助手,支持飞书文档解析、地理编码与腾讯地图可视化,助力产业关系图谱构建。
23256 1
畅用7个月无影 JVS Claw |手把手教你把JVS改造成「科研与产业地理情报可视化大师」
|
3天前
|
人工智能 API 开发工具
Claude Code国内安装:2026最新保姆教程(附cc-switch配置)
Claude Code是我目前最推荐的AI编程工具,没有之一。 它可能不是最简单的,但绝对是上限最高的。一旦跑通安装、接上模型、定好规范,你会发现很多原本需要几小时的工作,现在几分钟就能搞定。 这套方案的核心优势就三个字:可控性。你不用依赖任何不稳定服务,所有组件都在自己手里。模型效果不好?换一个。框架更新了?自己决定升不升。 这才是AI时代开发者该有的姿势——不是被动等喂饭,而是主动搭建自己的生产力基础设施。 希望这篇保姆教程,能帮你顺利上车。做出你自己的作品。
Claude Code国内安装:2026最新保姆教程(附cc-switch配置)
|
10天前
|
缓存 人工智能 自然语言处理
我对比了8个Claude API中转站,踩了不少坑,总结给你
本文是个人开发者耗时1周实测的8大Claude中转平台横向评测,聚焦Claude Code真实体验:以加权均价(¥/M token)、内部汇率、缓存支持、模型真实性及稳定性为核心指标。
4139 23
|
5天前
|
人工智能 缓存 BI
Claude Code + DeepSeek V4-Pro 真实评测:除了贵,没别的毛病
JeecgBoot AI专题研究 把 Claude Code 接入 DeepSeek V4Pro,跑完 Skills —— OA 审批、大屏、报表、部署 5 大实战场景后的真实体验 ![](https://oscimg.oschina.net/oscnet/up608d34aeb6bafc47f
2391 6
Claude Code + DeepSeek V4-Pro 真实评测:除了贵,没别的毛病
|
6天前
|
人工智能 JSON BI
DeepSeek V4 来了!超越 Claude Sonnet 4.5,赶紧对接 Claude Code 体验一把
JeecgBoot AI专题研究 把 Claude Code 接入 DeepSeek V4Pro 的真实体验与避坑记录 本文记录我将 Claude Code 对接 DeepSeek 最新模型(V4Pro)后的真实体验,测试了 Skills 自动化查询和积木报表 AI 建表两个场景——有惊喜,也踩
2849 8