C语言之结构体内存的计算

2023-11-11

结构体的内存

一.提出疑问

     结构体占用的是一片连续的内存空间,大小是由成员变量的类型决定的。但并不是计算所有成员变量的类型大小之和那么简单。

先举一个实例:

struct student {
	int age; //4个字节
	int telephone;  //4个字节
};
int main()
{
	struct student s;
	//      s的字节为8;
	printf("%d", sizeof(s));
	return 0;
}

如图,结构体student中含有2个int类型成员变量,代码运行后,可知结构体的大小为8个字节。

可真的是因为两个成员变量的大小之和嘛?

我们再来一个实例:

struct student {
	int age; //4个字节
    char name; //1个字节
	int telephone;  //4个字节
};
int main()
{
	struct student s;
	//      s的字节为12;
	printf("%d", sizeof(s));
	return 0;
}

图中的三个成员变量分别为 int,char,int类型,三个成员变量的内存相加为9个字节

可为什么结构体内存会等于12呢?

 很明显结构体内存大小 不等于 所有成员变量的内存大小之和

二.计算结构体内存大小

在计算结构体内存大小时,我们得先学会一个规则-----对齐规则。

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

理论已出,现在来实践计算一下:

struct student {
	int age; //1个字节
    char name; //1个字节
	int telephone;  //4个字节
};
int main()
{
	struct student s;
	//      s的字节为12;
	printf("%d", sizeof(s));
	return 0;
}

例如以上代码,借助图 解释:

 

 解释思路:

  1.  首先根据规则,第一个成员得在地址为0处,然后成员的内存大小为4个字节,所以占用4个空间,地址0~3
  2. 第二个成员变量得开始遵循对齐规则,由于char为1个字节,所以无论地址为多少,都是1的整数倍,也占用一个空间,地址4
  3. 最后,第三个成员为int类型,此时地址已经到达了4的位置,而现在需要对齐int类型4个字节的整数倍,则需要从8开始,直到占有4个空间,地址8~11
  4. 结束:结构体总大小为最大对齐数(成员变量的内存)的整数倍,而该结构体的最大的内存类型为int 4个字节,而此时使用的内存0~11,则是12,满足条件。

 注:若是不满足时,则需要往后扩充,直到满足为止。

 创作不易,路过的帅哥美女,动动小手,点点赞咯,蟹蟹啦

                                                                              若文章有问题,请指出,虚心接受批评

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言之结构体内存的计算 的相关文章

  • 逻辑回归案例练习

    逻辑回归 场景一 在训练的初始阶段 我们将要构建一个逻辑回归模型来预测 某个学生是否被大学录取 设想你是大学相关部分的管理者 想通过查看申请学生的两次测试的评分 来决定他们是否被录取 现在你拥有之前申请学生的可以用于训练逻辑回归的训练样本集
  • 钉钉微应用接入(企业内部开发)

    文档中心 https open doc dingtalk com 钉钉后台配置 创建微应用流程 获取企业号CorpID Secret 登录钉钉OA管理后台 微应用 工作台设置 仅企业主管理员可查看 应用开发流程 注册企业 进入OA管理后台

随机推荐

  • 原来gdb的底层调试原理这么简单

    一 前言 这篇文章来聊聊大名鼎鼎的GDB 它的豪门背景咱就不提了 和它的兄弟GCC一样是含着金钥匙出生的 在GNU的家族中的地位不可撼动 相信每位嵌入式开发工程师都使用过gdb来调试程序 如果你说没有用过 那只能说明你的开发经历还不够坎坷
  • 【04】Unity AR 2022Vuforia——虚拟按钮超详细教程【含代码】

    04 Unity AR 2022Vuforia 虚拟按钮超详细教程 含代码 虚拟按钮超详细教程 含代码 目录 04 Unity AR 2022Vuforia 虚拟按钮超详细教程 含代码 1 前期工作 2 创建Virtual Button 3
  • Vue3-初识Vue3、创建Vue3工程、vue3组合式API(setup、ref函数、reactive函数)、响应式原理、计算属性、监视属性

    Vue3 1 目录 Vue3 1 一 Vue3简介 二 创建Vue3 0工程 1 使用vue cli创建 2 使用vite创建 三 常用的Composition API 组合式API 1 拉开序幕的setup 2 ref函数 3 react
  • Flutter沉浸式透明状态栏-flutter自定义凸起BottomAppBar导航

    注意 flutter项目默认是使用Kotlin语言 在Google I O 2017中 Google 宣布 Kotlin 取代 Java 成为 Android 官方开发语言 Kotlin详情见 https www kotlincn net
  • 异常处理--java.lang.reflect.MalformedParameterizedTypeException

    异常信息 org springframework beans factory BeanCreationException Error creating bean with name sqlSessionFactory defined in
  • C语言指针详解

    1 指针是什么 指针是内存中一个最小单元的编号 也就是地址 平时口语中说的指针 通常指的是指针变量 是用来存放内存地址的变量 所以 指针就是地址 口语中说的指针通常指的是指针变量 1 指针变量 我们可以通过 取地址操作符 取出变量的内存其实
  • 活动效果评估体系,该怎么搭建?

    如果让你来评估这次活动 你会怎么分析 无论是面试还是工作 做数据分写的同学都经常遇到这个问题 今天我们系统讲解一下 场景还原 某音乐类APP 对新用户进行一个新注册即送7天会员权益的活动 用户注册后 自主决定是否点击领取 为期1个月 问 如
  • python函数定义参数类型和返回值类型

    python中我们也可以定义函数的参数类型和返回值类型 如下代码 函数参数和返回值的类型声明 python函数类型的声明 更加有意义 更加实用一些 def add a b param a int param b int return int
  • C++ STL中map.erase(it++)用法原理解析

    之前在代码中使用map erase函数时 误搬了vector erase的用法 导致Server down掉了 好在在测试环境就及时发现了问题 在上线前进行了补救 以下总结一下map erase的正确用法 首先看一下在循环中使用vector
  • 灰灰-325-326-327-2019中南大学计算机上机-走台阶(3)

    1 n个台阶 一次走1阶或2阶 问走n阶有多少可能 1 lt n lt 1000 000 结果用1000 0000 7取模输出 输入格式 输入台阶数n 输出格式 结果用1000 0000 7取模输出 输入样例 3 输出样例 3 includ
  • 【技巧】各编辑器基础开发快捷键

    文章目录 一 IDEA 二 vim 1 各个模式的相互切换 2 正常模式 3 插入模式 4 底行模式 5 视图模式 三 Visual Studio 2017 四 PyCharm 一 IDEA psvm 回车 快速打出main函数 sout
  • docker网络自定义

    docker网络自定义 书接上回 我们认识了docker0网络以及 link参数的使用 https blog csdn net hello list article details 124815842 今天来了解下docker自定义网络 那
  • Java描述贪心算法解决背包问题

    思路 首先将物品根据性价比排好序在一个集合里 性价比 价格 重量 然后根据性价比从大到小依次依次放入背包 如果没办法放入这个物品的全部 就放入一部分 如果可以放入全量物品 就放入全量物品 Main java的代码 import java u
  • get和post区别

    get参数通过url传递 post放在post是放在请求头的包体 request body 中 因为参数直接暴露在url中 get比post更不安全 所以不能用来传递敏感信息 get请求在url中传递的参数是有长度限制的 get提交的数据最
  • 『动态规划·差分』队列

    P r o b l e m mathrm Problem Problem S o l u t i o n mathrm Solution Solution 首先考虑第一小问 问题转化为 每一行的问题互相独立 令 c j a i j a 1
  • Java之经典排序算法(一)

    一 冒泡排序 不稳定的排序算法 快希选堆 1 算法思路 比较相邻元素 如果第一个比第二个大 则交换这两个元素 从第一个元素开始依次往后比较相邻两个元素 直到最后一个比较完 这样最后一个元素就是最大的元素 再次从第一个元素开始依次往后比较相邻
  • 锁,避免虚假唤醒,注意死锁

    unique lock
  • 记录kitti数据集的坐标系转换问题

    Calib文件说明 以00000 txt文件为例 详细介绍每行含义 P0 7 070493000000e 02 0 000000000000e 00 6 040814000000e 02 0 000000000000e 00 0 00000
  • DC-DC电源模块输出先放大电容还是小电容

    最好的资料是电容厂家的设计指南 1 电容简单的等效模型是C ESL ESR 2 通常电解电容容量越大 ESR越小 ESL越大 承受纹波电流越大 3 电流流经阻抗最小路径 4 大电流 PCB走线电阻不能忽略 高频纹波电流PCB走线电感不能忽略
  • C语言之结构体内存的计算

    结构体的内存 一 提出疑问 结构体占用的是一片连续的内存空间 大小是由成员变量的类型决定的 但并不是计算所有成员变量的类型大小之和那么简单 先举一个实例 struct student int age 4个字节 int telephone 4