结构体对齐详解

2023-05-16

1.结构体基础知识

a.认识结构体

结构体是一些值的集合,这些值称为成员变量.结构体的每个成员可以是不同类型的变量.

//声明一个结构体类型
//声明一个学生类型(Stu就是你对这个结构体的称呼)
struct Stu
{
	char name[20];
	char tele[12];  //成员变量
	char sex[10];
	int age;
}s4,s5,s6;//全局变量
struct Stu s3;//全局变量
int main()
{
	//创建结构体变量(局部的)
	struct Stu s1;
	struct Stu s2; 
}

b.结构体自引用

//结构体的自引用
typedef struct Node
{
	int data;
	//struct Node n; sizeof(struct Node)无限包含下去错误
	struct Node* next;//找到同类型的其它变量
}Node;//你只用关心这里就好了,我们给结构体创建了另一个名字

c.结构体嵌套使用

struct T
{
	double weight;
	int  age;
};
struct S
{
	char c;
	int a;
	double d;
	char arr[20];
	struct T st;//嵌套了上一个结构体
};

int main()
{
	struct S s = { 'c',100,3.14,"hello disposable",{55.6,20} };
	printf("%c %d %lf %s %lf %d\n", s.c, s.a, s.d, s.arr,s.st.weight,s.st.age);
}

 2.结构体对齐(重点)

//结构体内存对齐
struct s1
{
	char c1;
	int a;
	char c2;
};
struct s2
{
	char c1;
	char c2;
	int a;
};
int main()
{
	struct s1 s1 = { 0 };
	printf("声明的第一个结构体大小为%d字节\n", sizeof(struct s1));//12
	printf("该结构体变量大小为%d字节\n", sizeof(s1));//12
	struct s2 s2 = { 0 };
	printf("声明的第二个结构体大小为%d字节\n", sizeof(struct s2));//8
	printf("该结构体变量大小为%d字节\n", sizeof(s2));//8
}

明明两个结构体的内容一样为什么它们所占内存的大小不一样呢?对就是结构体需要对齐的原因.

我们先看一下结构体对齐规则:你可能初次看有点懵,等会后面我会引出例子来讲解.规则:

a.结构体中的第一个成员在与结构体变量偏移量为0的地址处

b.其它成员变量要对齐到一个名叫对齐数的整数倍的地址处.补充:对齐数=编译器默认的一个对齐数与该结构体中的成员变量大小中的较小值.我使用的是vs2022,默认对齐数为8.

c.结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍.

d.如果存在了嵌套结构体的情况,嵌套的结构体则对齐到自己的成员变量中最大对齐数的整数倍处,包含该嵌套结构体的结构体大小为其成员变量(包含嵌套结构体)最大对齐数的整数倍

看到这里你应该懵了吧,没关系看例子

A.先看看上面的那个例子这是结构体1的

 A.1这是结构体2的

  B例子2

struct s3
{
	double d;
	char c;
	int i;
};
int main()
{
	printf("该结构体大小为%d字节\n", sizeof(struct s3));//16
}

  B.1这是该结构体内存图

   C例子3

struct s2
{
	char c1;
	char c2;
	int a;
};
struct s3
{
	int  d;
	char c;
	int i;
	struct s2 t;//结构体嵌套
};
int main()
{
	printf("该结构体大小为%d字节\n", sizeof(struct s3));//20
}

  C.1内存图

   D.总结

   记住要好好动笔哦,如果有什么问题欢迎评论区留言,点个赞吧,蟹蟹!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

结构体对齐详解 的相关文章

  • CCF元素选择器

    思路 fat数组保存其直接祖先 include lt bits stdc 43 43 h gt using namespace std const int maxn 61 105 int n m fat maxn dot maxn stri
  • ICU4C 介绍: C/C++ 平台强大的国际化应用开发组件

    ICU4C 介绍 C C 43 43 平台强大的国际化应用开发组件 荣 施李 shilirong 64 gmail com 软件工程师 EMC 简介 xff1a 随着全球经济快速一体化 xff0c 信息的国际化成为了当前热门的话题 xff0
  • Java数据类型的转换:隐式(自动)转换与强制转换

    一 数据类型的分类 Java 中数据类型分为基本数据类型及引用数据类型 Java 数据类型的转换一般分三种 xff0c 分别是 xff1a 简单数据类型之间的转换 xff1b 字符串与其它数据类型的转换 xff1b 其它实用数据类型转换 二
  • java通用方法equals、hashcode的重写注意事项

    最近在读effictive java这本书 xff0c 看到关于java通用方法重写时的某些规则 xff0c 又想起项目中重写bean的equals方法 xff0c 仔细一想确实有很多不正确的地方 xff0c 所幸项目中的那个对象使用频率低
  • 正则表达式基础

    正则表达式其实算是单独的技术 xff0c 在各个语言中细微的区别 xff0c 但本质上是一致的 xff0c 都是用来描述和匹配符合某个规则的语法的字符串呗 当要验证符合某些规则 xff0c 例如邮件地址什么的 xff0c 使用起来就很方便
  • java并发、多线程知识点

    1 线程实现方法 即实现runnable接口或者继承thread类 xff0c 由于java是单继承机制 xff0c 所以一般采用实现runnable接口的方法 public class LiftOff implements Runnabl
  • 光的基础知识

    光子的产生 光子是电磁辐射的基本粒子 xff0c 它是由电场和磁场相互作用而产生的 当电场和磁场发生变化时 xff0c 它们会相互影响并产生能量 xff0c 这个能量以光子的形式释放出来 例如 xff0c 当电流通过导体时 xff0c 电子
  • Ubuntu 11.10 下ARM 用 TFTP Server 下载程序

    Update 2012 12 16 补充1 xff1a 不安转xinetd来搭建 sudo apt get install tftpd hpa tftp hpa 配置文件内容如下 xff1a cat etc default tftpd hp
  • WSL2+VSCODE+OPENCV

    在网上能找到WSL和VSCODE的配置方法 xff0c 能找到VSCODE和opencv的使用方法 xff0c 能找到WSL和opencv的配置方法 xff0c 但很少有wsl 43 vscode 43 opencv xff0c 但描述不清
  • Gradle开发环境配置

    最近公司有个外包项目需要接回来维护 xff0c 需要gradle才能跑起来 xff0c 之前一直用的是maven构建项目 xff0c 便摸索着将项目环境构建完成 xff1a 1 首先确定本地 Java 环境装好 xff0c 然后下载去官网下
  • 绕过nftables/PacketFilter防火墙过滤规则传输ICMP/ICMPv6数据包的漏洞详解(上)

    背景知识介绍 目前的防火墙总共分四类 xff1a 包过滤防火墙 xff1a 包过滤防火墙不检查数据区 xff0c 包过滤防火墙不建立连接状态表 xff0c 前后报文无关 xff0c 应用层控制很弱 应用网关防火墙 xff1a 不检查IP T
  • 使用集群中唯一一个MON恢复集群ceph-mon服务(记一次故障恢复)

    使用集群中唯一一个MON恢复集群ceph mon服务 记一次故障恢复 xff09 概述 当集群因为某些故障导致mon集群损坏 xff0c 或者多个mondb混乱 xff0c 此时ceph mon服务不可用 xff0c 既所有ceph命令会卡
  • virtualbox虚拟机的配置如何优化

    以下是一些可能有用的提示 xff0c 可帮助您优化VirtualBox虚拟机的性能和配置 xff1a 分配足够的内存和处理器资源 xff1a 在配置虚拟机时 xff0c 确保为虚拟机分配足够的内存和处理器资源 xff0c 这将有助于提高虚拟
  • 【单片机】【笔记】定时器初值的计算

    晶振频率 11 0592M 机器频率 11 0592 12 61 921600个 每秒 每个机器周期 xff0c 定时器计数值加1 当数值为0 xff0c 256 xff0c 65536时 xff08 TH TL同时为0时 xff09 xf
  • vue项目打包成apk安装包详细步骤

    第一步 下载HbuilderX DCloud官网 HBuilderX下载地址 第二部 创建5 43 App项目 完事点创建 得到这么个玩意 把没用的都干掉 xff0c 留下manifest json就行了 然后把打包好的vue项目的内容拿来
  • Hyper-v安装及使用详细教程

    安装 前面先用了VMware xff0c 以为比较方便安装时不用自己配置 xff0c 结果还是要自己配置 那今天来试下win10自带的Hyper v 首先打开设置 应用 程序和功能 启用或关闭 Windows 功能 找到 Hyper v 勾
  • windows11 安装安卓子系统,玩转安卓APP

    开启Hyper v 将Hyper v勾上 xff0c 确定 xff0c 重启电脑 安装windows subsystem for Android 百度盘链接 提取码 xff1a gby8 下载完成之后直接打开安装会提示安装失败 因此需要使用
  • Ubuntu使用

    买了个Redmibook 15 Pro 锐龙版 xff0c 比较方便携带 xff0c 打开尝试了一下就把系统重装了 xff0c 据说linux系统更适合开发 xff0c 因此装了ubuntu20 10 安装 之前有写过在虚拟机安装 xff0
  • go语言使用jwt认证

    这几天在学习nodejs xff0c 进一步了解npm xff0c 学习过程中解开了以前的一个疑惑 xff0c 以前不知道token可以携带信息 xff0c 只以为是用来做对比的 xff0c 学到了jwt身份认证 xff0c 知道了如何使用
  • 注册Office教育版账号流程实现oneDrive1TB储存

    正常的个人微软账号使用oneDrive只有5GB的储存空间 xff0c 可以通过注册office教育版账号获取oneDrive有1TB储存空间的账号 临时教育邮箱 如果使用普通邮箱注册只能注册个人免费账号 xff0c 如下图 xff0c 也

随机推荐

  • windows 安装 gcc 编译 fyne 项目

    fyne官网 一 说明 可以看到官网写的 xff0c 如果是第一次使用 xff0c 需要安装 go 语言 xff0c 安装 gcc xff0c 获取 fyne 依赖 xff0c 其中麻烦点的就是 gcc xff0c 如果不安装 gcc xf
  • 解决 Go 语言使用 cmd 命令,在控制台输出的中文内容为乱码

    场景 xff1a 在使用 fyne 做一个小桌面程序的时候 xff0c 用到了 cmd 命令 xff0c 如果遇到了错误就进行判断或使用 label 输出错误 xff0c 结果输出的中文是乱码的 因为终端使用的是 gbk 编码 xff0c
  • Windows 安装 Docker Desktop 到其他盘、迁移虚拟硬盘映像文件、压缩虚拟硬盘映像占用空间

    一 建立软连接 首先先建立软连接 xff0c 将 Docker 默认安装的目录链接到其他盘 xff0c 这个最好使用 windows 自带的终端 xff0c 使用 powershell 有可能会识别不到 mklink 命令 mklink j
  • python中pip安装的包都在哪里?

    1 windows的话 xff0c 在cmd中使用 pip list 查看已安装的包名2 windows的话 xff0c 在cmd中然后用 pip show 包名 xff0c 就可以看到安装到哪了 3 练习 xff1a 将pymysql通过
  • Rust 基础(一)

    Rust 1 65 发布于2022 11 03 一 安装 配置环境变量 RUSTUP HOME Rustup元数据和工具链将被安装到Rustup主目录中 默认 xff1a USERPROFILE rustup CARGO HOME Carg
  • 定制适用于ARM平台的Ubuntu rootfs(根文件系统)

    0 背景 有一个很厉害的师兄针对我们实验室的需求设计了一块控制板 xff0c 以beaglebone为基础 xff0c 由于更改了一些底层的硬件 xff0c 所以重新定制编译的内核 xff0c 并预先烧写到了板子的flash中 现在需要安装
  • Win10使用附件中的远程桌面连接Ubuntu 16.04图形界面(xrdp方法)

    Ubuntu16 04下 以下命令行皆是在终端中运行 xff1a 安装xrdp sudo apt get install xrdp 安装vnc4server sudo apt get install vnc4server 安装xubuntu
  • CMake构建OpenCV项目

    文章目录 前言一 基本概念二 操作步骤1 创建OpenCV程序2 创建CMake文件3 编译项目4 运行项目 总结 前言 CMake是个一个开源的跨平台自动化建构系统 xff0c 用来管理软件建置的程序 xff0c 并不依赖于某特定编译器
  • 5GC基础:架构和网元

    1 主要内容 5GC xff08 SA xff09 架构介绍 5GC主要网元及功能对比 5GC网络架构的主要变化 SBA架构网元的注册 发现与选择CUPS边缘计算MM和SM的分离计算与存储的解耦与非3GPP的互操作能力开放PCC架构的变化
  • visual studio进入时许可证已过期解决方案

    新手小白 xff0c 记录一下 问题 xff1a 解决步骤 xff1a 1 打开visual studio installer gt 点击更多 gt 点击修复 2 等待更新安装 xff08 耗时略微有些长 xff09 3 点击启动 xff0
  • Qt 在windows 和linux 下的编译教程

    Qt 源码下载地址 xff1a https download qt io archive qt 打开上面的网址 xff0c 进入 submodules 目录下载 qtbase everywhere src 6 4 2 zip xff0c 这
  • 【位运算总结】 之 左移运算

    左移运算的概念 xff1a 左移运算符 应用 xff1a 1 优化代码 因为左移运算比乘法快 xff0c 因此x 61 x 2可优化为x 61 x lt lt 1 2 计算一个数的二进制的某位 如题 xff1a 给定一个含不同整数的集合 x
  • 关于Qt的QMainWindow、QTableWidget、QComboBox、QScrollArea的widget导致的qss无效问题

    问题 前阵子比较忙 xff0c 忘记记录这个问题了 事情是我在写QTableWidget的qss时候 xff0c 要把下图红色箭头指向的这个边角样式改变时发现的 我发现我对QTabelCornerButton写样式无效 但是我印象里 xff
  • Ubuntu 系统 dpkg 命令使用详解

    dpkg 即 package manager for Debian xff0c 是 Debian 和基于 Debian 的系统中一个主要的包管理工具 xff0c 可以用来安装 构建 卸载 管理 deb 格式的软件包 安装软件 使用 span
  • [python]输出“hello 姓名”

    print 34 hello tianxinyao 34
  • Java实现敏感词过滤 - IKAnalyzer中文分词工具

    IKAnalyzer 是一个开源的 xff0c 基于java语言开发的轻量级的中文分词工具包 官网 xff1a https code google com archive p ik analyzer 本用例借助 IKAnalyzer 进行分
  • 虚拟机可以连接,但是不能上网

    解决方法链接 虚拟可以连接但不能上网 xff0c 一般是DNS的问题 解决方法 xff1a xff08 1 xff09 进入网络共享中 xff0c xff08 2 xff09 进入本地连接 属性 xff08 3 xff09 进入TCP IP
  • QThread必须要了解的几个函数

    概述 如果想对Qt中的QThread有个更加深刻的了解 xff0c 必须要知道这几个重要的函数 xff0c 现在就一一介绍下 函数介绍 属性返回值函数体功能staticQThread QThread currentThread 返回当前线程
  • codeforces 766C Mahmoud and a Message

    题意 xff1a 给你一个长度为n的仅包括小写字母的字符串 xff0c 每个小写字母能在一个长度不超过a i xff08 i是小写字母序号如a为0 xff09 的子串中 问 xff1a 1 有多少种分隔方法 2 所有分割方法中最长的子串有多
  • 结构体对齐详解

    1 结构体基础知识 a 认识结构体 结构体是一些值的集合 这些值称为成员变量 结构体的每个成员可以是不同类型的变量 声明一个结构体类型 声明一个学生类型 Stu就是你对这个结构体的称呼 struct Stu char name 20 cha