#pragma pack () /*取消指定对齐,恢复缺省对齐*/本文引用地址:http://www.eepw.com.cn/article/148849.htm

sizeof(struct D)值为7。

对于char型数据,其自身对齐值为1,对于short型为2,对于int,float,double类型,其自身对齐值为4,单位字节。

这里面有四个概念值:

1)数据类型自身的对齐值:就是上面交代的基本数据类型的自身对齐值。

2)指定对齐值:#pragma pack (value)时的指定对齐值value。

3)结构体或者类的自身对齐值:其成员中自身对齐值最大的那个值。

4)数据成员、结构体和类的有效对齐值:自身对齐值和指定对齐值中较小的那个值。

有了这些值,我们就可以很方便的来讨论具体数据结构的成员和其自身的对齐方式。有效对齐值N是最终用来决定数据存放地址方式的值,最重要。有效对齐N,就 是表示“对齐在N上”,也就是说该数据的存放起始地址%N=0.而数据结构中的数据变量都是按定义的先后顺序来排放的。第一个数据变量的起始地址就是 数据结构的起始地址。结构体的成员变量要对齐排放,结构体本身也要根据自身的有效对齐值圆整(就是结构体成员变量占用总长度需要是对结构体有效对齐值的整 数倍,结合下面例子理解)。这样就不难理解上面的几个例子的值了。

例子分析:

分析例子B;

struct B {

char b;

int a;

short c;

};

假设B从地址空间0x0000开始排放。该例子中没有定义指定对齐值,在笔者环境下,该值默认为4。第一个成员变量b的自身对齐值是1,比指定或者默认指 定对齐值4小,所以其有效对齐值为1,所以其存放地址0x0000符合0x0000%1=0.第二个成员变量a,其自身对齐值为4,所以有效对齐值也为 4,所以只能存放在起始地址为0x0004到0x0007这四个连续的字节空间中,复核0x0004%4=0,且紧靠第一个变量。第三个变量c,自身对齐 值为2,所以有效对齐值也是2,可以存放在0x0008到0x0009这两个字节空间中,符合0x0008%2=0。所以从0x0000到0x0009存 放的都是B内容。再看数据结构B的自身对齐值为其变量中最大对齐值(这里是b)所以就是4,所以结构体的有效对齐值也是4。根据结构体圆整的要求, 0x0009到0x0000=10字节,(10+2)%4=0。所以0x0000A到0x000B也为结构体B所占用。故B从0x0000到0x000B 共有12个字节,sizeof(struct B)=12;

同理,分析上面例子C:

#pragma pack (2) /*指定按2字节对齐*/

struct C {

char b;

int a;

short c;

};

#pragma pack () /*取消指定对齐,恢复缺省对齐*/

第一个变量b的自身对齐值为1,指定对齐值为2,所以,其有效对齐值为1,假设C从0x0000开始,那么b存放在0x0000,符合0x0000%1= 0;第二个变量,自身对齐值为4,指定对齐值为2,所以有效对齐值为2,所以顺序存放在0x0002、0x0003、0x0004、0x0005四个连续 字节中,符合0x0002%2=0。第三个变量c的自身对齐值为2,所以有效对齐值为2,顺序存放

在0x0006、0x0007中,符合0x0006%2=0。所以从0x0000到0x00007共八字节存放的是C的变量。又C的自身对齐值为4,所以 C的有效对齐值为2。又8%2=0,C只占用0x0000到0x0007的八个字节。所以sizeof(struct C)=8.

有 了以上的解释,相信你对C语言的字节对齐概念应该有了清楚的认识了吧。在网络程序中,掌握这个概念可是很重要的喔,在不同平台之间(比如在Windows 和Linux之间)传递2进制流(比如结构体),那么在这两个平台间必须要定义相同的对齐方式,不然莫名其妙的出了一些错,可是很难排查的哦

上一页

1

2

下一页

C语言第一个字节地址,C语言字节对齐详解相关推荐

  1. 电大计算机C语言1253,1253《C语言程序设计》电大期末精彩试题及其问题详解

    1253<C语言程序设计>电大期末精彩试题及其问题详解 (34页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 19.90 积分 实用文档&l ...

  2. IPv4、IPv6地址、组播地址及子网子划分详解二子网划分

    IPv4.IPv6地址.组播地址及子网子划分详解二子网划分 5.子网划分 5.1.子网掩码 5.2.无类域间选择CIDR 5.3.根据子网掩码和CIDR值划分子网 5.4.二进制AND运算在划分子网中 ...

  3. IPv4、IPv6地址、组播地址及子网子划分详解三可变长子网掩码

    IPv4.IPv6地址.组播地址及子网子划分详解三可变长子网掩码 5.5.可变长子网掩码(VlSM) 5.5.可变长子网掩码(VlSM) 先看一下分类组网,路由选择协议RIPv1没有包含子网信息的字段 ...

  4. c语言四字节对齐,C语言字节对齐详解

    先了解4个基本概念: 1.数据类型自身对齐值:即数据类型的大小(数组取数组成员类型的自身对齐值),如char的自身对齐值是1,short是2,int.float.double都是4,单位字节 2.结构 ...

  5. C语言第一课:初始C语言

    目录 前言 一.自我介绍和简介 二.初始C语言 2.1 何为C语言 2.2 第一个C语言程序 2.2.1 头文件的解释 2.2.2 main函数 2.2.3 printf函数 三.C语言当中的数据类型 ...

  6. C语言 第一节 简单的C语言

    参考哔哩哔哩UP主:"学士帽"做的笔记. C语言专升本考试大纲: C语言程序的基本结构 数据类型及其运算和输入输出 基本语句 选择结构 循环结构(重点) 难点: 数组 函数 指针 ...

  7. c语言windows驱动编程入门,Windows驱动开发技术详解 PDF扫描版[175MB]

    Windows驱动开发技术详解由浅入深.循序渐进地介绍了windows驱动程序的开发方法与调试技巧.本书共分23章,内容涵盖了windows操作系统的基本原理.nt驱动程序与wdm驱动程序的构造.驱动 ...

  8. c语言中用来指示文件缓冲区中具体读写位置,C语言文件读写操作中缓冲区问题和setbuf函数详解...

    清除和设置文件缓冲区 (1).清除文件缓冲区函数: int fflush(FILE *stream); int flushall(); fflush()函数将清除由stream指向的文件缓冲区里的内容 ...

  9. c语言中自定义函数返回数组,C语言自定义函数返回数组的方法(图文详解)

    C语言自定义函数返回数组的方法(图文详解) 最近看到一些同学问题,有提到说:如何在一个函数中返回数组呢? 能否直接在自定义 函数中,写成char *类型返回值,直接返回呢?,代码如下: 直接返回str ...

最新文章

  1. VC++大数据量绘图时无闪烁刷屏技术实现
  2. Linux命令技巧之30个必会的命令技巧
  3. 不职业不同睡姿,你是哪一种?
  4. 不对全文内容进行索引的 Loki 到底优秀在哪里
  5. 项目部署mysql安装_Tomcat7+jdk+mysql安装及项目部署
  6. python一般用什么编译器-Python常用的编辑器有哪些?老男孩Python
  7. [FJOI2007]轮状病毒
  8. MySQL删除外键约束
  9. 第六次的服务端课程:JDBC,数据源配置
  10. C#正则_取出标签内的内容(非贪婪)
  11. 绝对的干货大放送:常用正则表达式收集大全
  12. linux wsdl2java_Web Service开发之利用WSDL生成Java工程
  13. HttpRequest类
  14. 《王道计算机考研》:数据链路层
  15. 登陆模块邮箱用例设计_邮箱注册模块测试用例.doc
  16. Mac新手必看教程,苹果电脑基本使用操作,苹果电脑基本操作
  17. 关于SketchUp 2017版本安装之后一打开就会发送错误报告的问题
  18. php 获取手机信息
  19. qcloud.login 登录失败,可能是网络错误或者服务器发生异常的多种解决方法
  20. 中望3D2022 草图综合训练

热门文章

  1. 今晚直播丨有关Oracle 19c认证体系的一些变化及备考技巧
  2. 细致入微:如何使用数据泵导出表的部分列数据
  3. 入微:探究文档中找不到的12c并行索引扫描新特性
  4. 未完待续:关于DB Link和SCN,你还需要知道的是...
  5. 支撑1300+矿井监控,华为云数据库助力打造智能矿山
  6. 面向对象的Python编程,你需要知道这些!
  7. 如何使用mock应对测试所需随机数据
  8. 一文快速掌握IPv6基础知识及使用指南
  9. 高性能Web动画和渲染原理系列(2)——渲染管线和CPU渲染
  10. CSE 支持spring 4/5 以及spring boot 1/2 maven组件依赖关系配置参考