数据结构 / 结构体字节计算
1. 结构体的存储
- 结构体各个成员的地址是连续的
- 结构体变量的地址是第一个成员的地址
2. 64位操作系统8字节对齐
- 结构体的总字节大小是各个成员字节的总和,字节的总和需要是最宽成员的倍数
- 结构体的首地址是最宽成员的倍数
- 结构体各个成员的偏移量是该成员字节的倍数,否则填充空字节
例子1:
#include <string.h>
#include <stdlib.h>
#include <stdio.h>struct A
{int a; //4 char b; //1 short c; //2 float d; //4 }a;int main(int argc, const char *argv[])
{printf("a=%p\n", &a);printf("a.a=%p\n", &a.a);printf("a.b=%p\n", &a.b);printf("a.c=%p\n", &a.c);printf("a.d=%p\n", &a.d);printf("sizieof(a)=%ld\n", sizeof(a));return 0;
}
计算

运行结果
a=0x55b0037eb018
a.a=0x55b0037eb018
a.b=0x55b0037eb01c
a.c=0x55b0037eb01e
a.d=0x55b0037eb020
sizieof(a)=12
例子2:
#include <string.h>
#include <stdlib.h>
#include <stdio.h>struct A
{int *a; //8 char b; //1 double c; //8 long d; //8 } s1; int main(int argc, const char *argv[])
{printf("s1=%p\n", &s1);printf("s1.a=%p\n", &s1.a);printf("s1.b=%p\n", &s1.b);printf("s1.c=%p\n", &s1.c);printf("s1.d=%p\n", &s1.d);printf("sizieof(s1)=%ld\n", sizeof(s1));return 0;
}
计算

运行结果
s1=0x55e754e4e040
s1.a=0x55e754e4e040
s1.b=0x55e754e4e048
s1.c=0x55e754e4e050
s1.d=0x55e754e4e058
sizieof(s1)=32
例子3:
#include <string.h>
#include <stdlib.h>
#include <stdio.h>struct S
{char a[5]; //int b; //} s3; int main(int argc, const char *argv[])
{printf("s3=%p\n", &s3);printf("s3.a=%p\n", &s3.a);printf("s3.b=%p\n", &s3.b);printf("sizieof(s3)=%ld\n", sizeof(s3));return 0;
}
计算

运行结果
s3=0x55da08b43018
s3.a=0x55da08b43018
s3.b=0x55da08b43020
sizieof(s3)=12
3. 32位操作系统,4字节对齐:
- 结构体的总字节大小是各个成员字节的总和,字节的总和需要是最宽成员的倍数
- 如果最宽成员是1,则是1的倍数
- 如果最宽成员是2,则是2的倍数
- 如果最宽成员是4,8,则是4的倍数
- 结构体的首地址是最宽成员的倍数
- 结构体各个成员的偏移量是该成员字节的倍数,否则填充空字节
- 如果成员字节是1,则偏移量是1的倍数
- 如果成员字节是2,则偏移量是2的倍数
- 如果成员字节是4,8,则偏移量是4的倍数
例子4:
#include <string.h>
#include <stdlib.h>
#include <stdio.h>struct S5
{char a; //int *b; double c;long d;}s5 ;struct S6
{char e[5];struct S5 s5; int f;}s6;int main(int argc, const char *argv[])
{printf("s6.e=%p\n", &s6.e);printf("s6.s5.a=%p\n", &s6.s5.a);printf("s6.s5.b=%p\n", &s6.s5.b); printf("s6.s5.c=%p\n", &s6.s5.c);printf("s6.s5.d=%p\n", &s6.s5.d);printf("s6.f=%p\n", &s6.f);printf("sizieof(s6)=%ld\n", sizeof(s6));return 0;
}
~
计算

运行结果
s6.e=0x565cf040
s6.s5.a=0x565cf048
s6.s5.b=0x565cf04c
s6.s5.c=0x565cf050
s6.s5.d=0x565cf058
s6.f=0x565cf05c
sizieof(s6)=32
相关文章:
数据结构 / 结构体字节计算
1. 结构体的存储 结构体各个成员的地址是连续的结构体变量的地址是第一个成员的地址 2. 64位操作系统8字节对齐 结构体的总字节大小是各个成员字节的总和,字节的总和需要是最宽成员的倍数结构体的首地址是最宽成员的倍数结构体各个成员的偏移量是该成员字节的倍数…...
rancher2.6 docker版本部署
1. 拉取镜像 docker pull rancher/rancher:v2.6.5 注: 上面命令中rancher的版本v2.6.5,仅仅是我因为我们环境中使用的k8s都是 1.20.1 到1.23.6 之间的版本。rancher支持的k8s版本,在github上查看:Release Release v2.6.5 ranche…...
UE5人物残影学习(材质实现)
学习视频 UE4简单的材质球残影人教学,你学会了吗!_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1rY411q7Yb/?spm_id_from333.788.top_right_bar_window_history.content.click 结果预览 1.创建残值,混合模式勾选半透明 “混合模…...
Spring Boot 内置工具类
一、对象、数组、集合 ObjectUtils 1.获取对象的基本信息 // 获取对象的类名。参数为 null 时,返回字符串:"null" String nullSafeClassName(Object obj)// 参数为 null 时,返回 0 int nullSafeHashCode(Object object)// 参数…...
C语言--每日选择题--Day27
第一题 1. 对于代码段,问下面不可以表示a[1]地址的是() int a[10]; A:&a[0] 1 B:a sizeof(int) C:(int*)&a 1 D:(int*)((char*)&a sizeof(int)) 答案及解析 A A:取到…...
黑马程序员索引学习笔记
文章目录 索引的分类从索引字段特性从物理存储从数据结构组成索引的字段个数 InnoDB主键索的Btree高度为多高呢?explain执行计划最左匹配原则索引失效情况SQL提示覆盖索引、回表查询前缀索引索引设计原则 索引的分类 从索引字段特性 主键索引、唯一索引、常规索引、全文索引…...
新手如何对一个web网页进行一次渗透测试
新手如何对一个web网页进行一次渗透测试 文章目录 新手如何对一个web网页进行一次渗透测试什么是渗透测试?渗透测试和红蓝对抗的区别那么拿到一个网站后如何进行一次优雅的渗透测试呢 什么是渗透测试? 在获得web服务运营的公司书面授权的情况下,模拟攻击者的行为…...
vs2019 - MFC对话框程序的工程名称不支持下划线命名法
文章目录 vs2019 - MFC对话框程序的工程名称不支持下划线命名法概述笔记备注END vs2019 - MFC对话框程序的工程名称不支持下划线命名法 概述 正在写账单分析程序, 用MFC 对话框. 因为比较习惯下划线命名法, 就在向导中给工程名称起了一个my_test这样的名称(下划线命名法, 小…...
java JDBCUtils 使用静态代码块连接数据库 全程值保持一次连接
\src\com\data\entity\JDBCUtils.java 使用静态代码块连接数据库 全程值保持一次连接 package com.data.entity;import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.datasource.DriverManagerDataSource;import javax.sql.DataSource;pub…...
剑指 Offer(第2版)题解(C++ Version)
剑指 Offer(第2版)题解(C Version) 剑指 Offer(第2版)题解(C Version)面试题 3:数组中重复的数字面试题 4:二维数组中的查找面试题 5:替换空格面试…...
6.15合并二叉树(LC617-E)
算法: 前序、中序、后序都可以,这道题正常逻辑一般都是用前序 正确代码: 这里就是在root1这颗树上改的,也可以新建一个树。 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode …...
百度智能小程序系统源码+关键词排名优化 附带完整的搭建教程
百度智能小程序系统的开发背景是基于百度强大的技术实力和对用户需求的深入理解。在移动互联网时代,用户对便捷、高效、智能的服务需求越来越高。而小程序作为一种轻量级的应用程序,恰好能够满足用户的这些需求。然而,开发一个小程序需要掌握…...
2019年11月7日 Go生态洞察:Go Modules v2及更高版本
🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…...
vue3通过provide和inject实现多层级组件通信
父组件 <template><div><h1>我是父组件 {{num}}</h1><hr><child></child></div> </template><script setup> import child from ./child.vue; import { ref,provide } from vue; let num ref(520) provide(pare…...
【Java学习笔记】72 - 满汉楼 - 餐饮管理系统
项目代码 https://github.com/yinhai1114/Java_Learning_Code/tree/main/IDEA_Chapter26 一、需求说明 满汉楼项目功能多,界面复杂,涉及到复杂的awt和swing技术和事件编程,做如下调整: 1.去掉界面和事件处理(工作中使用很少),使…...
【我的创作纪念日】
机缘 大家好,我是圥忈ゼ, 2023 年 07 月 20 日,我撰写了第 1 篇技术博客:《我的编程未来规划》,也是由于我高考后的专业选择,和就业方向的选择,加上想立志成为一名专业 IT 作者,我结…...
车载通信架构 —— 传统车内通信网络MOST总线(光纤传输、专精多媒体)
车载通信架构 —— 传统车内通信网络MOST总线(光纤传输、专精多媒体) 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都…...
使用Pytorch从零开始构建Energy-based Model
知识回顾: [1] 生成式建模概述 [2] Transformer I,Transformer II [3] 变分自编码器 [4] 生成对抗网络,高级生成对抗网络 I,高级生成对抗网络 II [5] 自回归模型 [6] 归一化流模型 [7] 基于能量的模型 [8] 扩散模型 I, 扩散模型 II 在本教程中…...
基于C#实现梳排序
为什么取名为梳,可能每个梳都有自己的 gap 吧,大梳子 gap 大一点,小梳子 gap 小一点。上一篇我们看到鸡尾酒排序是在冒泡排序上做了一些优化,将单向的比较变成了双向,同样这里的梳排序也是在冒泡排序上做了一些优化。 …...
盘点72个Android系统源码安卓爱好者不容错过
盘点72个Android系统源码安卓爱好者不容错过 学习知识费力气,收集整理更不易。 知识付费甚欢喜,为咱码农谋福利。 链接:https://pan.baidu.com/s/1qiWeLjF2i4dlgmTYgPPSvw?pwd8888 提取码:8888 项目名称 A keyboardlisten…...
网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...
边缘计算医疗风险自查APP开发方案
核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...
【Java学习笔记】Arrays类
Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...
3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...
CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...
【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...
uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
