你必须知道的C语言问题(9)
问:如下代码,两个结构体类型成员变量相同,只是成员顺序不同,为什么大小不同?
#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include <stdlib.h>typedef struct _test1{uint8_t a;uint32_t b;uint8_t c;
}test1_t;typedef struct _test2{uint8_t a;uint8_t c;uint32_t b;
}test2_t;int main(int argc, char* argv[])
{printf("sizeof(test1_t): %ld\r\nsizeof(test2_t): %ld\r\n", sizeof(test1_t), sizeof(test2_t));return 0;
}
运行输出:
sizeof(test1_t): 12
sizeof(test2_t): 8
答:变量默认遵循如下对齐规则:一字节的变量不做要求,两字节的变量至少要两字节对齐,四字节变量至少是四字节对齐。什么是字节对齐呢?以四字节对齐为例,就是变量的首地址要是4的倍数。结构体成员变量也要遵守如上的对齐规则,此外结构体的首地址要按最大成员变量对齐,结构体的大小必须是最大成员变量的整数倍。
test1_t类型的结构体它的最大成员变量b是4字节,该结构体一定是4字节对齐的,也就是第一个成员变量a是4字节对齐,第二个变量b也必须是4字节对齐,a和b之间会有3个字节的空隙,c大小是1字节,紧跟在b之后即可,但是test1_t的大小一定是4的倍数,所以c的后面也会有3字节的空隙。总的大小是12字节。
同样的方法分析test2_t类型的结构体,a占1字节,b占1字节,b和c之间有2字节的空隙,c占4字节,总大小8字节。
问:这样结构体成员之间会有空隙浪费空间,有没有办法让各成员紧密排列不留空隙?
答:可用__attribute__((packed))指定结构体成员之间紧密排列,而不按默认对齐方式预留空隙。代码如下:
#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include <stdlib.h>typedef struct _test1{uint8_t a;uint32_t b;uint8_t c;
} __attribute__((packed)) test1_t ;typedef struct _test2{uint8_t a;uint8_t c;uint32_t b;
}__attribute__((packed)) test2_t;int main(int argc, char* argv[])
{printf("sizeof(test1_t): %ld\r\nsizeof(test2_t): %ld\r\n", sizeof(test1_t), sizeof(test2_t));return 0;
}
运行输出:
sizeof(test1_t): 6
sizeof(test2_t): 6
相关文章:
你必须知道的C语言问题(9)
问:如下代码,两个结构体类型成员变量相同,只是成员顺序不同,为什么大小不同? #include <stdio.h> #include <stdint.h> #include <string.h> #include <stdlib.h>typedef struct _test1{uint…...
如何通过网络找到自己想要的LabVIEW知识?
学习LabVIEW或其他编程技术时,无法依赖某一篇文章解决所有问题。重要的是通过多种途径获取灵感,并学会归纳总结,从而逐渐形成系统性的理解。这种持续学习和总结的过程是技术提升的基础。通过网络找到所需的LabVIEW知识可以通过以下几个步骤进…...
SCRM电商管理后台Axure高保真原型 源文件
在电商行业蓬勃发展的今天,企业急需一个全面的客户关系管理(CRM)系统来优化他们的电商运营。我们的Scrm电商管理后台应运而生,它不仅是一个集中化的管理平台,更是企业提升客户互动和销售业绩的得力助手。 预览地址 ht…...
重载new,delete , RTTI,类成员指针
重载new,delete 执行过程 重载new,delete 和普通的运算符重载不同,并非重载new,delete 的行为,而是改变内存分配的方式,将对象放置在特定的内存空间中 new运算符操作: 调用STL标准模板库的…...
基于SSM+Vue+MySQL的在线医疗服务系统
系统展示 用户前台界面 管理员后台界面 系统背景 随着医疗信息化的快速发展和患者对便捷医疗服务需求的日益增长,开发一个高效、可靠的在线医疗服务系统显得尤为重要。基于SSM(SpringSpring MVCMyBatis)框架、前端采用Vue.js、后端连接MySQL数…...
Windows 11上pip报‘TLS/SSL connection has been closed (EOF) (_ssl.c:1135)‘的解决方法
这个只是简单记录一下,可能是我用了代理的缘故,即便是把源换成国内的,例如阿里云,也会报错,例如: pip install matplotlib Looking in indexes: https://mirrors.aliyun.com/pypi/simple/, https://pypi.or…...
53 - I. 在排序数组中查找数字 I
comments: true edit_url: https://github.com/doocs/leetcode/edit/main/lcof/%E9%9D%A2%E8%AF%95%E9%A2%9853%20-%20I.%20%E5%9C%A8%E6%8E%92%E5%BA%8F%E6%95%B0%E7%BB%84%E4%B8%AD%E6%9F%A5%E6%89%BE%E6%95%B0%E5%AD%97%20I/README.md 面试题 53 - I. 在排序数组中查找数字 …...
基于 TDMQ for Apache Pulsar 的跨地域复制实践
导语 自2024年9月6日起,TDMQ Pulsar 版专业集群支持消息、元数据两级跨地域复制功能,消息级复制解决用户全球地域的数据统一归档问题,元数据级复制提供解决用户核心业务跨地域容灾的场景。 用户在跨地域场景遇到的疑问和挑战 在跨地域相关…...
无线通信感知/雷达系统算法专业技术栈
无论是在工业界还是在学业界,无线通信感知一体化都是一个热门的方向,作为一个24届毕业生,刚好处于行业当中,就总结一下自己浅薄认知下,自己觉得已经掌握或者应该掌握的技术栈和专业能力,与大家共勉。 Rada…...
离谱碾压!奇安信中标:高出第二名近70分!
2024年08月09日,广东省政务服务和数据管理局,近日发布了网络安全第三方服务(2024年)项目之关基检查及重要政务应用安全检查服务招标公告! 预算金额:2,896,200.00元,其中安全检查服务包…...
HOT 100(七)栈、堆、贪心算法
一、栈 1、每日温度 使用单调递减栈来解决。主要思路是遍历temperatures数组,利用栈来存储还没有找到比当前温度高的天数的索引。当遇到比栈顶索引所对应温度更高的温度时,就可以确定当前这一天的温度比之前那一天高。索引的差值就是等待的天数。 求一…...
速盾:高防服务器租用需要注意什么事项
在当今互联网时代,网络安全问题日益严峻。各种网络攻击手段层出不穷,给企业和个人的网站带来了巨大的安全威胁。为了保障网站的安全稳定运行,高防服务器成为了许多人的选择。而在租用高防服务器时,需要注意以下几个事项。 一、选择…...
【数据库】MySQL内置函数
本篇分享一些在MySQL中常见的一些内置函数,如日期函数,字符串函数和数学函数,以方便于操作数据库中的数据。 1.日期函数 我们先整体观察一下这些函数再讲解案例 日期函数使用起来都非常就简单 获得年月日: select current_dat…...
Promise查漏及回调地狱结构优化
目录 前言一、执行器函数的执行顺序二、如何在then()中抛出错误三、期约的"非重入"特性四、串行化期约五、应对回调地狱结语 前言 依据《JavaScript高级程序设计》对Promise期约相关进行查缺补漏. 一、执行器函数的执行顺序 执行器函数虽作为期约的参数, 却是期约的…...
SpringCloud-05 Resilience4J 服务降级和熔断
服务雪崩:指在多个服务之间存在依赖关系时,当一个服务发生故障或不可用时,导致其他服务也无法正常工作的情况。这种现象通常是因为服务之间的依赖关系过于紧密,当一个服务发生故障时,其他服务无法正确处理该服务的请求…...
哈希表、算法
哈希表 hash: 在编程和数据结构中,"hash" 通常指的是哈希函数,它是一种算法,用于将数据(通常是字符 串)映射到一个固定大小的数字(哈希值)。哈希函数在哈希表中尤为重要…...
变更AWS EC2 实例配置或实例类型
在本文中,九河云将带您了解如何更改由 Amazon Elastic Block Store (EBS) 支持的 Amazon Elastic Compute Cloud (EC2) 实例的类型。更改实例类型可以优化成本和性能,使其更符合您的应用程序需求。 准备工作 在开始之前,请确保您已完成以下…...
【前端】ref引用的作用
首先,我们要明确一点,使用vue的好处是: 想要减少开发者直接操作dom元素。使用组件模版,实现代码的服用。 ref的属性的实现是为了取代原生js中使用id、class等标识来获取dom元素。 helloworld组件 <template><div clas…...
运用Java实现倒计时功能
这个功能其实是比较好实现的,一般来说java中实现倒计时有两种方法: 1、使用 scheduledexecutorservice创建一个可重复执行的任务,直到时间到: ScheduledExecutorService 是 Java 中一种用于安排延迟或定期任务的工具。我们可以使…...
Vue 第三方调用若依系统实现系统单点登录
应用场景 甲方现有平台系统拟集成我方新开发系统,实现单点登录功能,即用户登录主平台后,无需重复登录即可无缝访问新系统,提升用户体验与操作效率。 解决方案 实现代码 前端 Step:1 新建ssoLogin.vue页面 <template><d…...
MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...
关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...
自然语言处理——循环神经网络
自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM)…...
Map相关知识
数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...
AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机
这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机,因为在使用过程中发现 Airsim 对外部监控相机的描述模糊,而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置,最后在源码示例中找到了,所以感…...
2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)
安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...
mac 安装homebrew (nvm 及git)
mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用: 方法一:使用 Homebrew 安装 Git(推荐) 步骤如下:打开终端(Terminal.app) 1.安装 Homebrew…...
TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?
在工业自动化持续演进的今天,通信网络的角色正变得愈发关键。 2025年6月6日,为期三天的华南国际工业博览会在深圳国际会展中心(宝安)圆满落幕。作为国内工业通信领域的技术型企业,光路科技(Fiberroad&…...
