C语言——结构体类型数据在内存中存储

2023-11-10

一、结构体对齐

要讲到结构体类型数据在内存中的存储,首先我们先来看看一自定义结构体类型数据。

struct S
{
	char ch;
	short a;
	int i;
};

它在内存中到底占多少字节空间呢?1 + 2 + 4 = 7 个字节?
为了解决这个问题,我们来了解一下结构体对齐。
在了解之前涉及到一个偏移量,这里简单普及一下

**偏移量:**
在结构体类型数据开始存储位置我们可以记为起始位置为0的的偏移处,之后
以1个字节依次递增为1、2、3偏移处。
**对齐数:**
结构体成员的自身大小和和默认对齐数(vs默认对齐数为8)的较小值,在C语言
中也有求对齐数的库函数offsetof()对于函数具体可参考cplusplus网站。
offsetof():用来计算结构体成员相对于起始位置的偏移量
#include <stdio.h>
#include <stddef.h>
struct S
{
	char ch;
	short a;
	int i;
};

int main()
{
	struct S s1;
	printf("%d\n", (int)offsetof(struct S, ch));
	printf("%d\n", (int)offsetof(struct S, a));
	printf("%d\n", (int)offsetof(struct S, i));
	return 0;
}

在这里插入图片描述

对齐原则一:结构体的第一成员直接对齐到相对于结构体变量起始位置为0的偏移处。
对齐原则二:从第二个成员变量开始,要对齐到某个【对齐数】的整数倍的偏移处。
对齐原则三:结构体的总大小,必须是最大对齐数的整数倍,每个结构体变量都有最大的对齐数就是最大对齐数。
对齐原则四:如果出现嵌套结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(涵嵌套结构体的对齐数)的整数倍。

二、结构体变量在内存储存练习

创建结构体类型数据struct S1、struct S2,struct S3,计算它们在内存占用多少字节的内存空间以及在内存中的分布

struct S1
{
	char ch;//自身大小1与默认对齐数8较小值为1
	short a;//2 / 8 --> 2
	int i;//4 / 8 --> 4
};

struct S2
{
	double d;//自身大小8与默认对齐数8较小值8
	char c;//1 / 8 --> 1
	int i;//4 / 8 --> 4
};

struct S3
{
	char c1;//自身大小1与默认对齐数8较小值为1
	struct S1 s1;//8 / 8 --> 8
	double d;//8 / 8 --> 8
};

int main()
{
	struct S1 s1; struct S2 s2; struct S3 s3;
	//最终结构体的大小必须是最大对齐数的整数倍
	printf("%zu\n", sizeof(struct S1));
	printf("%zu\n", sizeof(struct S2));
	printf("%zu\n", sizeof(struct S3));

	return 0;
}

在内存中的分布:
在这里插入图片描述
运行结果:
在这里插入图片描述

在这里插入图片描述

结语:

每个人的成长和进步都离不开点点滴滴的积累,如果小编的内容对您有所帮助,希望友友们三连加关注哦,你的支持是小编创作的最大动力。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言——结构体类型数据在内存中存储 的相关文章

随机推荐

  • 深入剖析Flannel-简介

    随着docker容器化兴起 云计算面对的挑战越来越大 例如 网络管理 存储等 一个数据中心很容易搞出成百上千个容器 这么多的容器我们需要如何管理呢 今天来介绍的flannel就是为了解决网络问题 一 网络管理方案 目前使用最多的解决方案有两
  • 网友收集的最全Java架构资料,百度网盘请带走!!!

    一位网友在网上收集的Java资料 包含 1 Java技术栈进阶路线图 2 技术进阶资料 视频 源码 PPT等 3 技术进阶书籍 网友比较用心了 免费分享给大家 Java架构师技术进阶路线图 高清大图 建议收藏 架构技术进阶资料 架构技术进阶
  • Intellij IDEA编辑golang设置GOPATH变量

    因为在使用IDEA进行开发go项目时 在项目目录下创建了src目录 在目录下创建了go包文件 但是在main包内引入包 编译时报错 说没有找到包 路径没有对应该项目的src下 然后就在idea里面设置 因为对这个ide不熟 所以在网上花了一
  • 显示器连接vdc服务器,基于数字化校园的图像分析型VDC服务器的设计与实现

    摘要 随着国家对高校仪器设备投入的增加 各高校也越来越重视大型仪器设备的开放和共享 要合理有效地利用仪器 管理并统计仪器的使用状况 为决策者提供可靠而准确的数据依据 就必须采集大量的真实的数据 在这些数据中 实验过程的图像信息可以作为管理的
  • Vue引入jQuery

    1 在项目中安装jquery npm install jquery save dev 或者 打开package json文件 在里面加入这行代码 jquery后面的是版本 根据你自己需求更改 dependencies jquery 2 2
  • python 重置索引_Pandas的reset_index()重置索引列

    来源 pandas中的reset index 数据清洗时 会将带空值的行删除 此时DataFrame或Series类型的数据不再是连续的索引 可以使用reset index 重置索引 import pandas as pd import n
  • SpringBoot整合Activiti7使用

    最近做的一个项目中需要实现员工请假的功能 计划使用activiti来实现请假流程 所以去学习了一下相关的知识 并且完成了一个简单的请假实例 Activiti相关 Activiti介绍 Activiti是基于Apache许可的开源BPM平台
  • docker四种网络模式

    文章目录 一 为什么要了解docker网络 二 docker 网络理论 三 docker的四类网络模式 3 1 bridge模式 3 2 host模式 3 3 container模式 3 4 none模式 四 bridge模式下容器的通信
  • Python计算排队等待时间

    假设某景点门口 目前在你之前的人数为n人 景点的管理人员每间隔x分钟放入c人 你期望能够在t分钟内进入景点 编写程序 判断你是否能够在预期时间t内进入景点 计算排队等候时间 n int input 你前面的人数 x int input 放人
  • 排列序数

    排列序数 X星系的某次考古活动发现了史前智能痕迹 这是一些用来计数的符号 经过分析它的计数规律如下 为了表示方便 我们把这些奇怪的符号用a q代替 abcdefghijklmnopq 表示0 abcdefghijklmnoqp 表示1 ab
  • 服务器mbr文件丢失吗,硬盘中了MBR病毒不要急,一款工具帮你搞定,保证数据不丢失!...

    经常看见论坛上面有人说自己的硬盘被锁了 开机后出现一行红字 FUCK YOU POJIEZHE 这个问题主要的原因是 病毒对MBR分区的修改导致的 MBR病毒简介 引导区病毒是PC机上最早出现的病毒 也是我国最早发现的病毒种类 这类病毒主要
  • 【数据库实验报告】索引,数据插入,数据查询

    索引 建立索引 例3 13 为学生 课程数据库中的Student Course SC三个表建立索引 CREATE UNIQUE INDEX Stusno ON Student Sno CREATE UNIQUE INDEX Coucno O
  • springboot上传base64大图,接收的字段值为null 解决办法

    问题描述 通过mui ajax方法上传base64格式的图片和用户id时 springboot后端接收的数据有时为空 而且两个字段是同时有或者同时没有 查看上传成功的图片 最大的大小是1 13M 故猜测是由于springboot或者tomc
  • 目前没有时间和精力来更新博客了

    尽量回复一些总线相关的问题 转载一些可能对大家有所帮助的文章 等以后有时间写文章了再更新 欢迎一起作技术交流 技术方面包含但不限于CAN EtherCAT ProfiNet之外的总线技术
  • gin context和官方context_Go语言gin框架从入门到精通(3)

    gin的渲染 1 各种数据格式的响应 json 结构体 XML YAML类似于java的properties ProtoBuf 分别对所有数据格式举个列子 func main r gin Default 1 json响应 r GET som
  • linux 网络协议栈栈 socket

    1 应用层socket类型 2
  • 7个视频素材网站,不用再为素材发愁

    1 pond5 https www pond5 com 全球最大的开放版权视频合集 不仅有视频 还有音乐 动态图片 用这些世界级的好素材 让你的视频如虎添翼 2 splashbase http www splashbase co 在这里搜索
  • 别让不好意思害了你

    有些事情是不能告诉别人的 有些事情是不必告诉别人的 有些事情是根本没有办法告诉别人的 而且有些事情是 即使告诉了别人 你也马上会后悔的 所以 假使你够聪明 那么 最后的办法就是静下来 啃啮自己的寂寞 或者反过来说 让寂寞来吞噬你 罗曼 罗兰
  • Django 应用 -- 发送邮件

    出现以上错误 是没有设置参数DJANGO SETTINGS MODULE os environ setdefault DJANGO SETTINGS MODULE emailclient settings Email 配置 emailcli
  • C语言——结构体类型数据在内存中存储

    结构体类型在内存中的存储 一 结构体对齐 二 结构体变量在内存储存练习 一 结构体对齐 要讲到结构体类型数据在内存中的存储 首先我们先来看看一自定义结构体类型数据 struct S char ch short a int i 它在内存中到底