C语言结构体计算大小结构体的对齐数,修改默认对齐数。

news2024/11/24 19:58:30

结构体的对齐规则

  1. 第一个成员在与结构体变量偏移量为0的地址处。
  2. 剩余成员变量要对齐到对齐数的整数倍的地址处。
    • 对齐数:编译器默认对齐数与该成员大小的较小值
    • vs中默认对齐数为8
    • 没有默认对齐数,那么对齐数就是其本身成员大小
  3. 结构体总大小为最大对齐数的整数倍。
  4. 嵌套结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是最大对齐数(含嵌套结构体的对齐数)的整数倍。

例1:

#include <stdio.h>

struct s1 {
	char c1;
	int i;
	char c2;
};

int main() {

	printf("%d" , sizeof(struct s1));

	return 0;
}

在这里插入图片描述
在这里插入图片描述
第一个成员 char c1 在结构体变量偏移 0地址 处开辟空间。第二个 int i 成员的大小是 4个字节,vs默认对齐数是 8 两者取较小值是 4,所以int i 成员要对齐到 4 的整数倍的地址处,中间的空间就浪费掉了。第三个成员 char c2 的大小是 1个字节,与最大对齐数取较小值是 1char c2 成员对齐到 1 的整数倍的地址处。所有成员分配完之后,现在是 9个字节,但是结构体的大小为最大对齐数的整数倍。成员中最大对齐数是 4个字节 ,要对齐到 4字节 的整数倍,所以最终 struct s1 结构体大小是 12字节


修改默认对齐数

语法:

#pragma pack( number )
  • number 指定默认对齐的是多少

例2:

#include <stdio.h>

#pragma pack(8)		// 设置默认对齐数为8
struct s1 {
	char c1;
	int i;
	char c2;
};
#pragma pack()		// 取消设置的默认对齐数,恢复默认

#pragma pack(1)		// 设置默认对齐数为1
struct s2 {
	char c1;
	int i;
	char c2;
};
#pragma pack()		// 取消设置的默认对齐数,恢复默认

int main() {

	printf("%d\n", sizeof(struct s1));  // 12
	printf("%d", sizeof(struct s2));	// 6


	return 0;
}

在这里插入图片描述
注:对齐数通常情况下设置为2的n次方。对齐数的不同,结构体的大小也可能不相同。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2个小工具让你轻松解决大数据/数据库测试

目录 前言&#xff1a; 研究背景 工具 支持功能 支持功能 使用方法 总结 前言&#xff1a; 做大数据/数据库测试时&#xff0c;通常需要编写复杂的测试用例代码或手动操作来测试系统的正确性和稳定性。但是&#xff0c;有些小工具可以轻松解决这个问题&#xff0c;提高测试效率…

python自动化测试- 自动化框架及工具

1 概述 手续的关于测试的方法论&#xff0c;都是建立在之前的文章里面提到的观点&#xff1a; 功能测试不建议做自动化接口测试性价比最高接口测试可以做自动化 后面所谈到的 测试自动化 也将围绕着 接口自动化 来介绍。 如果你想学习自动化测试&#xff0c;我这边给你推…

智慧绿色档案馆之八防一体化解决系统方案

主要涉及系统&#xff1a; 智慧档案馆温湿度监控系统 智慧档案馆净化系统 智慧档案馆防火监控系统 智慧档案馆防盗监控系统 智慧档案馆漏水监控系统 智慧档案馆空气质量监控系统 智慧档案馆自动化恒温恒净化系统 智慧档案馆大数据云平台建设系统 &#xff08;一&#xff09;技…

C语言实现青蛙跳台阶问题【图解】

目录 问题分析方法1&#xff1a;找规律问题分析方法2&#xff1a;递归两种方法的代码 题目 一只青蛙一次可以跳上1级台阶&#xff0c;也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法&#xff1f; 问题分析方法1&#xff1a;找规律 当n1时&#xff0c;显然…

vue+Nodejs+Koa搭建前后端系统(六)-- 用户登录

前言 采用vue3&#xff0c;vue-router版本为4.x前端构建工具采用viteIDE采用VSCODE&#xff0c;安装了MYSQL客户端插件 前端编写 安装并使用 vue-router 如果有vue-router&#xff0c;就略过这一小节。 vue-router完整教程&#xff1a;点这里>> 第一步&#xff1a;n…

MySQL ⽀持哪些存储引擎?默认使⽤哪个?MyISAM 和 InnoDB 引擎有什么区别,如何选择?

&#x1f4a7; M y S Q L ⽀持哪些存储引擎&#xff1f;默认使⽤哪个&#xff1f; M y I S A M 和 I n n o D B 引擎有什么区别&#xff0c;如何选择&#xff1f; \color{#FF1493}{MySQL ⽀持哪些存储引擎&#xff1f;默认使⽤哪个&#xff1f;MyISAM 和 InnoDB 引擎有什么区别…

centos tomcat

利用samba共享将所用的的组件复制到/usr/java/中 并给/usr/java设置777权限 Samba配置如下 重启smb服务 进入目录开始安装jdk 在当前目录解压jdk 配置环境变量 使配置生效 查看jdk版本 创建tomcat目录 解压tomcat的安装包到当前目录 进入tomcat配置目录 启动tomcat 先关闭在启…

【微服务】微服务架构设计

文章目录 背景一、流量入口Nginx二、网关三、业务组件四、服务注册中心五、缓存和分布式锁六、数据持久层七、结构型数据存储八、消息中间件九、日志收集十、任务调度中心十一、分布式对象存储 背景 当前&#xff0c;微服务架构在很多公司都已经落地实施了&#xff0c;下面用一…

01_Linux系统安装及使用

一、安装虚拟机软件 VMware16pro 安装链接&#xff1a;https://note.youdao.com/ynoteshare/index.html?id5fc5ad640596a0fbb41a21413ada4dad&typenote&_time1687172973066 二、安装Ubuntu 64 位 Linux系统 安装链接&#xff1a;https://note.youdao.com/ynoteshar…

【动态规划】简单多状态dp问题(1)打家劫舍问题

打家劫舍问题 文章目录 【动态规划】简单多状态dp问题&#xff08;1&#xff09;打家劫舍问题1. 按摩师&#xff08;打家劫舍Ⅰ&#xff09;1.1 题目解析1.2 算法原理1.2.1 状态表示1.2.2 状态转移方程1.2.3 初始化1.2.4 填表顺序1.2.5 返回值 1.3 编写代码 2. 打家劫舍Ⅱ2.1 题…

seaborn笔记:heatmap

绘制热力图 1 基本使用方法 seaborn.heatmap(data, *, vminNone, vmaxNone, cmapNone, centerNone, robustFalse, annotNone, fmt.2g, annot_kwsNone, linewidths0, linecolorwhite, cbarTrue, cbar_kwsNone, cbar_axNone, squareFalse, xticklabelsauto, yticklabelsauto, m…

C++ 教程(16)——字符串

C 字符串 C 提供了以下两种类型的字符串表示形式&#xff1a; C 风格字符串C 引入的 string 类类型 C 风格字符串 C 风格的字符串起源于 C 语言&#xff0c;并在 C 中继续得到支持。字符串实际上是使用 null 字符 \0 终止的一维字符数组。因此&#xff0c;一个以 null 结尾…

Mysql的学习笔记

目录 1、rc 级别的 mvcc 和 rr 级别的mvcc 有啥区别&#xff1f; 2、Innodb与MyIsam的文件结构&#xff1f; 3、Innodb 与MyIsam的简单对比&#xff1f; 4、innodb&#xff0c;Alter table 改字段类型&#xff0c;底层会经历什么过程&#xff1f; 5、Alter table 改字段类型…

Zebec Protocol 与 PGP 深度合作,将流支付更广泛的应用薪资支付领域

随着传统机构的入局&#xff0c;以及相关加密合规法规的落地&#xff0c;加密支付正在成为一种备受欢迎的全新支付方式。加密支付基于区块链底层&#xff0c;不受地域、时间等的限制&#xff0c;能够实时到账&#xff0c;具备去中心化、非许可等特性。 流支付是一种具备创新性的…

Jmeter和Postman做接口测试的区别你知道吗

区别1:用例组织方式 不同的目录结构与组织方式代表不同工具的测试思想&#xff0c;学习一个测试工具应该首先了解其组织方式。 Jmeter的组织方式相对比较扁平&#xff0c;它首先没有WorkSpace&#xff08;工作空间&#xff09;的概念&#xff0c;直接是TestPlan&#xff08;测…

搜索旋转排序数组(leetcode 33)

文章目录 1.问题描述2.难度等级3.热门指数4.解题思路思路复杂度分析 5.实现示例参考文献 1.问题描述 整数数组按升序排列&#xff0c;数组中的值互不相同 。 假设数组在预先未知的某个点上进行了旋转。 如数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2]。 搜索一个给定的目…

如何安装Nginx服务

目录 一、Nginx服务 Nginx的并发能力受影响因素 二、Nginx与Apache的差异 Nginx相对于Apache的优点 Apache相对于Nginx的优点 三、阻塞/非阻塞 四、同步/异步 Nginx应用场景 五、编译安装Nginx服务 关闭防火墙和安全机制 安装依赖环境 将相关包导入/opt当中 进入指…

Linux分区的基本概念。

文章目录 前言 一、分区概念 1&#xff0c;书名&#xff0c;主引导纪录&#xff08;&#xff2d;&#xff22;&#xff32;&#xff09; 2&#xff0c;正文&#xff0c;就是硬盘中纪录的数据。 3&#xff0c;索引相当于硬盘中的分区表 3.1主分区&#xff08;存放地址&#xff0…

React、Vue项目build打包编译后如何再修改后台请求地址

vue项目大家都了解&#xff0c;开发用 npm run dev/npm run serve。而要上线则必须是先将项目打包编译 npm run build 之后成为了普通的静态网页才可上线进行部署及发布。同样这时候我们也已经将代码全部写好了。如果说要改里面的某个值或者修改请求地址我们应该怎么办呢&#…

IDEA中创建编写JSP

一、安装Tmocat并配置环境 安装请参考&#xff1a;https://www.cnblogs.com/weixinyu98/p/9822048.html 安装请参考&#xff1a;https://www.cnblogs.com/zhanlifeng/p/14917777.html 注意&#xff1a;在安装成功Tomcat测试是否成功安装时&#xff0c;访问“http://localhost:8…