C语言结构体内存对齐

文章目录

  • 一、结构体内存对齐问题
  • 二、查看结构体成员起始位置
  • 三、设置内存对齐方式

一、结构体内存对齐问题

如下的info_s结构体类型,包含一个int型成员age, 一个char型成员gender, 一个int型成员id。
单从数据成员的大小进行分析,整个结构体的大小应为9字节。

#include <stdio.h>

typedef struct info_s {
	int age;
	char gender;
	int id;
}info_s; 

int main(){
	info_s info = {
		.age = 10 ,
		.gender = 0,
		.id = 555
	};
	printf("size: %d\r\n",sizeof(info));
	return 0;
}

在这里插入图片描述
实际运行结果,表明结构体的实际大小为12字节。

这样会带来如下的问题:
一段流式的内容,包含的是info_s类型的信息( 代码中的info_stream ), 直接通过强制类型转换的方式就无法正常解析。

#include <stdio.h>

typedef struct info_s {
	int age;
	char gender;
	int id;
}info_s; 

int main(){
	char info_stream[9] = {0};
	*((int *)info_stream) = 10;
	*((char *)(info_stream + sizeof(int))) = 1;
	*((int *)(info_stream + sizeof(int) + sizeof(char))) = 555;
	
	info_s * p_info = (info_s*)info_stream;
	
	printf("age: %d\r\ngender: %d\r\nid: %d\r\n",p_info->age,p_info->gender,p_info->id);
	
	return 0;
}

在这里插入图片描述
id字段的解析是不正常的。

二、查看结构体成员起始位置

利用宏offsetof可以查看成员的起始位置相较于结构体起始位置的偏移量。
包含在头文件<stddef.h>中。

#include <stdio.h>
#include <stddef.h>

typedef struct info_s {
	int age;
	char gender;
	int id;
}info_s; 

int main(){
	info_s info ;
	
	printf("age idx: %d\r\n",offsetof(info_s,age));       //第一个参数是结构体类型,第二个参数是成员
	printf("gender idx: %d\r\n",offsetof(info_s,gender)); //对struct info_s,进行了重命名,所以直接写info_s
	printf("id idx: %d\r\n",offsetof(struct info_s,id));  //没有重命名就写struct info_s
	
	return 0;
}

在这里插入图片描述
可以看到id成员是从相对于头部位置,地址为8的位置开始的。

三、设置内存对齐方式

通过#pragma pack(n)命令可以设置变量的内存对齐方式

#include <stdio.h>

#pragma pack(1)

typedef struct info_s {
	int age;
	char gender;
	int id;
}info_s; 

int main(){
	info_s info  = {
		.age = 10 ,
		.gender = 0,
		.id = 555
	} ;
	
	printf("size: %d\r\n",sizeof(info));
	
	return 0;
}

在这里插入图片描述
设置按照1字节对齐后,得到了结构体的大小为9个字节。

#include <stdio.h>

#pragma pack(1)

typedef struct info_s {
	int age;
	char gender;
	int id;
}info_s; 

int main(){
	char info_stream[9] = {0};
	*((int *)info_stream) = 10;
	*((char *)(info_stream + sizeof(int))) = 1;
	*((int *)(info_stream + sizeof(int) + sizeof(char))) = 555;
	
	info_s * p_info = (info_s*)info_stream;
	
	printf("age: %d\r\ngender: %d\r\nid: %d\r\n",p_info->age,p_info->gender,p_info->id);
	
	return 0;
}

在这里插入图片描述
数据解析也正确。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/272446.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【JavaWeb学习笔记】18 - 文件上传下载

项目代码 https://github.com/yinhai1114/JavaWeb_LearningCode/tree/main/fileupdown 目录 文件上传 一、基本介绍 二、文件上传的基本原理 ​编辑 三、文件上传应用实例 四、文件上传的注意细节 1.解决中文乱码问题 2.分割文件夹 3.防止重名 4.百度WebUploader 5.空…

Windows无法安装edge 无法连接Internet

如果出现以上问题&#xff0c;或者Edge浏览器无法更新&#xff0c;提示防火墙错误之类的都可以解决问题。 下载以下证书文件并导入即可解决问题。 MicrosoftRootCertificateAuthority2011.cer

注意力机制(数学公式)

人类视觉注意力机制极大地提高了视觉信息处理的效率与准确性 计算机注意力机制是为了让卷积神经网络注意到他更加需要注意的地方 &#xff0c;而不是什么都关注 。 分为三种注意力机制&#xff0c;空间注意力机制&#xff0c;通道注意力机制&#xff0c;以及两者的结合。 …

关于MULTI#STORM活动利用远程访问木马瞄准印度和美国的动态情报

一、基本内容 于2023年6月22日&#xff0c;一款代号为MULTI#STORM的新网络钓鱼活动将目标瞄准了印度和美国&#xff0c;利用JavaScript文件在受感染的系统上传播远程访问木马。 二、相关发声情况 Securonix的研究人员Den luzvyk、Tim Peck和Oleg Kolesnikov发表声明称&#x…

【AI服饰】孔雀背景服装_AIGC服饰订制设计咨询产业

服饰系列 AIGC&#xff08;Artificial Intelligence Generated Content&#xff09;服饰图是指通过人工智能生成的服装设计图案。随着人工智能技术的不断进步&#xff0c;AIGC服饰图在未来有着广阔的发展空间。 首先&#xff0c;AIGC服饰图可以提供更多的设计可能性。传统的服…

PYTHON基础:K最邻近算法

K最邻近算法笔记 K最邻近算法既可以用在分类中&#xff0c;也可以用在回归中。在分类的方法&#xff0c;比如说在x-y的坐标轴上又两个成堆的数据集&#xff0c;也就是有两类&#xff0c;如果这个时候有个点在图上&#xff0c;它是属于谁&#xff1f; 原则就是哪一类离它比较近…

RK3568平台开发系列讲解(Linux系统篇)GPIO调试手段

🚀返回专栏总目录 文章目录 一、/sys/kernel/debug/gpio目录二、/sys/kernel/debug/pinctrl 目录沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将介绍 GPIO调试手段。 一、/sys/kernel/debug/gpio目录 debugfs 是 Linux 内核提供的一个调试文件系统,可以用于…

Navicat删除连接报错:service in use cannot be deleted的解决方法

我在删除连接时遇到了这个报错&#xff0c;内容如图。下面我介绍两种解决方法&#xff0c;非常简单。 第一种 右键点击想要删除的连接&#xff0c;先选择“关闭连接”。再选择“删除连接” 第二种 如果第一种方法无效&#xff0c;直接关闭Navicat软件&#xff0c;重新打开。然后…

javaweb--实验十 --期末复盘

实验十 JDBC连接MySQL 本次实验没有代码补全&#xff0c;以下都是完整过程&#xff0c;详细关注连接过程的问题 一、实验目的&#xff1a; 1、掌握JDBC连接数据库的一般操作。 2、理解JavaBean的基本作用。 3、理解分层设计的思想。 二、 实验内容&#xff1a; 实现学生信…

广州华锐互动VRAR:VR煤矿安全警示教育系统提供真实生动的场景体验

随着科技的不断发展&#xff0c;虚拟现实&#xff08;VR&#xff09;技术已经逐渐渗透到各个领域&#xff0c;为人们的生活带来了诸多便利。在煤矿行业&#xff0c;VR技术的应用也日益受到关注。广州华锐互动开发的VR煤矿安全警示教育系统&#xff0c;旨在通过虚拟现实技术&…

WordPress主题大前端DUX v8.3源码下载

DUX主题8.3版本更新内容&#xff1a; 新增&#xff1a;Cloudflare Turnstile 免费验证功能 新增&#xff1a;子菜单页面模版&#xff0c;支持多级页面 新增&#xff1a;手机端文章内表格自动出现横向滚动条&#xff0c;可集体或单独设置滚动宽度 新增&#xff1a;标签云页面模版…

drf知识-06

视图集 #1 ModelViewSet&#xff1a; 视图类&#xff1a;GenericAPIView 映射&#xff1a;list create retrieve update destroy #2 ViewSetMixin类&#xff1a; 只要继承它&#xff0c;路由写法变了 分析&#xff1a;ViewSetMixin 不是视图类&#xff0c;支…

FTP不同方式使用与搭建与端口号常识了解

目录 一、FTP介绍 二、winServer2012搭建ftp服务器 在虚拟机搭建具体步骤 2.1、新建组&#xff1a; 2.2、新建用户名 2.3、把用户名与组绑定 2.4、安装ftp 2.5、配置ftp服务器 2.6、给文件夹调整权限 2.7、测试 a、服务器本机测试 b、外部机器测试 C、借助工具Mobal…

低代码开发:数字化转型的引擎

引言 在当今数字化时代&#xff0c;组织面临着不断变化的市场需求和技术挑战。数字化转型已成为维持竞争力的关键&#xff0c;而低代码开发正在崭露头角&#xff0c;成为加速创新和数字化转型的有力工具。本文将深入探讨低代码开发的核心概念、优势和应用&#xff0c;以揭示它…

数据库基础面试第四弹

1. Redis的数据结构有哪些 1. 字符串&#xff08;String&#xff09;&#xff1a; 字符串是Redis最基本的数据结构。它可以存储任意类型的数据&#xff0c;包括文本、整数或二进制数据。字符串类型的值最大可以达到512MB。 1 2 3 4 SET name "John" GET name 将字…

云原生Kubernetes:K8S集群版本升级(v1.22.14 - v1.23.14)

目录 一、理论 1.K8S集群升级 2.环境 3.升级集群&#xff08;v1.23.14&#xff09; 4.验证集群&#xff08;v1.23.14&#xff09; 二、实验 1. 环境 2.升级集群&#xff08;v1.23.14&#xff09; 2.验证集群&#xff08;v1.23.14&#xff09; 一、理论 1.K8S集群升级 …

【Python_09】Python基础语法(数据容器之列表详解)

文章目录 概述Python中的数据容器列表1.1 定义列表1.2列表取值与修改1.3 列表遍历1.3.1 使用for循环遍历列表1.3.2 使用while循环遍历1.3.3 使用enumerate()函数获取索引和元素 1.4 列表常用方法 概述 数据容器是用来存储和组织数据的数据结构和对象。可以以不同的方式存储和操…

摇杆控制人物移动

摇杆控制人物移动 一、UI搭建二、3d模型搭建三、脚本JoyStickBar.csPlayerController.cs 工程在我资源里名字叫Joystickbar.unitypackage [连接](https://download.csdn.net/download/qq_42194657/12043019?spm1001.2014.3001.5503) 一、UI搭建 JoyStickBar是图片背景 JoySt…

功能问题:如何在H5中实现拍照功能?3步搞定!

大家好&#xff0c;我是大澈&#xff01; 本文约2100字&#xff0c;整篇阅读大约需要4分钟。 感谢关注微信公众号&#xff1a;“程序员大澈”&#xff0c;免费领取"面试礼包"一份&#xff0c;然后免费加入问答群&#xff0c;从此让解决问题的你不再孤单&#xff01…

python 面试题第一弹

1. 如何理解Python中的深浅拷贝 浅拷贝&#xff08;Shallow Copy&#xff09;创建一个新的对象&#xff0c;该对象的内容是原始对象的引用。这意味着新对象与原始对象共享相同的内存地址&#xff0c;因此对于可变对象来说&#xff0c;如果修改了其中一个对象&#xff0c;另一个…