C语言中结构体内存分配(内含数组与结构体版)----超级详细版

2023-05-16

在网上看资料了很久,看的我头晕都没看懂,不如自己操作一遍,总结出来了经验。

首先我们要理解这几个概念:

1) 结构体变量的首地址是其最长基本类型成员的整数倍;

2) 结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal adding);

3) 结构体的总大小为结构体最宽基本类型成员大小的 整数 倍,如有需要,编译器会在最末一个成员之后加上填充字节(trailing padding)。

4) 结构体内类型相同的连续元素将在连续的空间内,和数组一样。

5) 如果结构体内存在长度大于处理器位数的元素,那么就以处理器的倍数为对齐单位;否则,如果结构体内的元素的长度都小于处理器的倍数的时候,便以结构体里面最长的数据元素为对齐单位。

上例子

(1)
1
这个结构体中,最长基本单位为double,即为8字节;
第一个变量a没有偏移,内存大小为3字节;
第二个变量b本身为20字节,与前面的变量加起来23字节,并不是8字节的倍数,故空出1字节,总共为24字节;
第三个变量c本身字节为1,刚好填入前面空出的字节中,故总共为24字节;
第四个变量d本身字节为8,为8字节的整数倍,故分配8字节,此时加起来32字节;
第五非变量e本身字节为1,并不是8字节的整数倍,故分配最小倍数8字节补齐,此时加起来内存大小40字节;

(2)
2
这个结构体中,最长基本单位为double,即为8字节;
第一个变量a没有偏移,内存大小为3字节;
第二个变量b本身为20字节,与前面的变量加起来23字节,并不是8字节的倍数,故空出1字节,总共为24字节;
第三个变量c本身字节为4,并不能填入之前的空出字节,故分配最小倍数8字节补齐,故总共为32字节;
第四个变量d本身字节为8,为8字节的整数倍,故分配8字节,此时加起来40字节;
第五非变量e本身字节为1,并不是8字节的整数倍,故分配最小倍数8字节补齐,此时加起来内存大小48字节;

(3)
3
这个结构体中,最长基本单位为int,即为4字节;
第一个变量a没有偏移,内存大小为3字节;
第二个变量b本身为20字节,与前面的变量加起来23字节,并不是4字节的倍数,故空出1字节,总共为24字节;
第三个变量c本身字节为1,可以填入之前的空出字节,故总共为24字节;
第四个变量d本身字节为4,为4字节的整数倍,故分配4字节,此时加起来28字节;
第五个变量e本身字节为1,并不是4字节的整数倍,故分配最小倍数4字节补齐,此时加起来内存大小32字节;

其实内含其他结构体原理相同
(4)
4
这个结构体中,最长基本单位为int,即为4字节;
第一个变量a没有偏移,内存大小为3字节;
第二个变量b本身为20字节,与前面的变量加起来23字节,并不是4字节的倍数,故空出1字节,总共为24字节;
第三个变量c本身字节为1,可以填入之前的空出字节,故总共为24字节;

此时下一个数据类型是结构体,我们先算出它自身结构体的内存大小:
这个结构体中,最长基本单位为double,即为8字节;
第一个变量a没有偏移,内存大小为3字节;
第二个变量d本身为8字节,为8的整数倍,所以为8字节,与前面加起来为11字节,此时不为8的倍数,故空出5字节,总共为16字节;
第三个变量e本身1字节,并不是8的整数倍,故分配最小倍数8字节补齐,此时加起来内存大小24字节;
所以内含结构体为24字节,且为外面最长基本字节4的整数倍,所以直接加上上面内存大小,总共为48字节

第五个变量d本身字节为4,为4字节的整数倍,故分配4字节,此时加起来52字节;
第六个变量e本身字节为1,并不是4字节的整数倍,故分配最小倍数4字节补齐,此时加起来内存大小56字节;

转载请标明原链接

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

C语言中结构体内存分配(内含数组与结构体版)----超级详细版 的相关文章

随机推荐

  • 汇编语言(按键控制蜂鸣器实验)

    汇编语言 xff08 按键控制蜂鸣器实验 xff09 各位社区的小伙伴们大家好 xff01 这个是本人写的一个基于80C51单片机的汇编语言小实验 xff0c 主要目的是利用开关来控制蜂鸣器发声 xff0c 代码本人亲测有效 xff01 x
  • Ubuntu16.04几分钟自动断网问题

    方法1 1 打开配置文件 etc ppp options sudo vi etc ppp options 2 在options文件中找到以下两行代码 lcp echo failure 4 lcp echo interval 30 3 把lc
  • Windows 未能启动。原因可能是最近更改了硬件或软件。解决此问题的步骤

    最近使用一键安装软件 xff0c 在win7系统上安装win xp系统 镜像由于金山和360软件拦截了 没有及时关闭 金山和360软件 注意 xff1a 启动列表中出现的 U 盘 xff0c 一般情况是以 USB HDD 打头 原因 xff
  • 联想电脑开机报错0190:Critical low-battery error

    报错信息 xff1a 0190 xff1a Critical low battery error ERROR 0190 Critical low battery error意思是 xff1a 0190 xff1a 电池电量极低错误 给电池充
  • zabbix使用ICMP ping监控网络状态

    简介 zabbix为我们提供了多种监控方式 本文所说的ICMP ping正是zabbix内部的Simple check 简单检查 很实用的小功能 可以实时了解主机的网络状态 Zabbix在监控网络的时候需要查看ping包的丢失率和响应时间
  • RDP远程登录 Windows server系统

    使用 RDP 文件登录 Windows 实例 目录 操作场景适用本地操作系统前提条件操作步骤 Windows 系统使用 RDP 登录 Linux 系统使用 RDP 登录 MacOS 系统使用 RDP 登录 操作场景 RDP 是 Remote
  • 解决webassembly pthread 子线程调用主线程js问题

    解决webassembly pthread 子线程调用主线程js问题 背景 xff1a web端项目做了一段时间后 xff0c 我们需求是加载工程是异步的 xff0c 主线程会调用wasm方法 xff0c wasm内部用pthread创建出
  • linux服务器中用U盘或者移动硬盘拷贝数据

    使用fdisk l查看硬盘个数 看到移动硬盘的设备名是 dev sdb 实施步骤 1 xff0c 以root用户登陆 先加载USB模块 modprobe usb storage 用fdisk l 看看U盘的设备 假如U盘是sda1 2 xf
  • win10键盘锁住了怎么解决

    有win10系统用户在使用的时候 xff0c 发现键盘被锁住了 xff0c 导致无法使用 xff0c 经过分析可能是不小心按到了键盘上的锁住键 锁定键盘的快捷键 笔记本电脑 xff1a Fn 43 Numlock 键 第一种方法 xff1a
  • 用Python读取CSV文件的5种方式

    典型的数据集stocks csv xff1a 一个股票的数据集 xff0c 其实就是常见的表格数据 有股票代码 xff0c 价格 xff0c 日期 xff0c 时间 xff0c 价格变动和成交量 这个数据集其实就是一个表格数据 xff0c
  • 多媒体技术选择题

    理论上 USB1 1的最高传输速率为12Mbps USB2 0的最高传输速率为480Mbps 实际上 只要小于理论值的数字就行了 Flash MX 软件 制作网络交互动画的编辑工具 Photoshop软件 是处理图像 图形的工具 电话质量采
  • C++程序设计选择题

    1 1 在哪种派生方式中 xff0c 派生类可以访问基类中的 protected 成员 B A public 和 private B public 和 protected C protected 和 private D 仅 protecte
  • MySQL之 XtraBackup 备份

    MySQL 系列连载之 XtraBackup 备份原理 xff08 1 xff09 导读 在日常的linux运维工作中 xff0c 大数据量备份与还原 xff0c 始终是个难点 关于mysql的备份和恢复 xff0c 比较传统的是用mysq
  • HP服务器硬盘坏了一块,教你如何快速更换

    一 需求描述 客户公司的一台HP DL360p Gen8服务器硬盘坏了 xff0c 为了防止另外一块硬盘也损坏 xff0c 急需去将坏的硬盘进行更换 服务器更换硬盘不同普通电脑更换硬盘 xff0c 需要人工去导数据 xff0c 服务器更换硬
  • win 7 电脑错误676、734、678、651等解决办法

    错误676 734等解决办法 运营商办理的网络接入方式都会提供宽带账号和密码 在使用拨号上网的时候 xff0c 经常会出现各种错误代码导致不能上网 以下是个人理解的处理办法 觉得实用请分享 xff0c 不喜勿喷 xff01 01 错误691
  • 序列检测——有限状态机FSM(附verilog代码)

    题目 xff1a 使用状态机检测 1101 xff0c 串行输入的测试序列为 11101101011010 xff0c 输出信号为valid有效信号 xff0c 检测到时输出高 xff0c 否则为低 xff0c 考虑序列叠加情况 xff0c
  • MFC中的CreateProcess函数的应用

    MFC与CMD信息的传递与返回 HANDLE hRead hWrite SECURITY ATTRIBUTES sa sa nLength 61 sizeof SECURITY ATTRIBUTES sa lpSecurityDescrip
  • 解决 eclipse移植androidstudio Could not determine 的问题

    解决 eclipse移植androidstudio Could not determine 的问题 因为帮朋友移植eclipse工程到android studio上开发 xff0c 按照教程先在eclipse 导出android 的工程 x
  • string与float数据的转换

    问题 xff1a 如何将6位小数的string数据转化为2位小数的float数据显示 xff1f 先通过atof 转化为6位小数的float数据 xff1b temp 61 atof strtemp sscanf 61 strtemp 34
  • C语言中结构体内存分配(内含数组与结构体版)----超级详细版

    在网上看资料了很久 xff0c 看的我头晕都没看懂 xff0c 不如自己操作一遍 xff0c 总结出来了经验 首先我们要理解这几个概念 xff1a 1 结构体变量的首地址是其最长基本类型成员的整数倍 xff1b 2 结构体每个成员相对于结构