为了让读者加深印象,我们这里在代码中没有使用0,而是使用的4,所以在最终计算出的结果部分减去了一个4才是偏移地址,当然实际使用中我们都是用的是0。

懂了上面的宏offsetof之后我们再来看看下面的代码:

#include

#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)

typedefstructstu1

{

inta;

charb[1];

intc;

}stu1;

voidmain()

{

printf("offsetof(stu1,a):\t%d\n",offsetof(stu1,a));

printf("offsetof(stu1,b):\t%d\n",offsetof(stu1,b));

printf("offsetof(stu1,c):\t%d\n",offsetof(stu1,c));

printf("sizeof(stu1)    :\t%d\n",sizeof(stu1));

}

运行结果为:

offsetof(stu1,a):       0

offsetof(stu1,b):       4

offsetof(stu1,c):       8

sizeof(stu1)    :       12

Press any key tocontinue

对于字节对齐不了解的读者可能有疑惑的是c的偏移量怎么会是8和结构体的大小怎么会是12呢?因该是sizeof(int)+sizeof(char)+sizeof(int)=9。其实这是编译器对变量存储的一个特殊处理。为了提高CPU的存储速度,编译器对一些变量的起始地址做了对齐处理。在默认情况下,编译器规定各成员变量存放的起始地址相对于结构的起始地址的偏移量必须为该变量的类型所占用的字节数的倍数。现在来分析下上面的代码,如果我们假定a的起始地址为0,它占用了4个字节,那么接下来的空闲地址就是4,是1的倍数,满足要求,所以b存放的起始地址是4,占用一个字节。接下来的空闲地址为5,而c是int变量,占用4个字节,5不是4的整数倍,所以向后移动,找到离5最近的8作为存放c的起始地址,c也占用4字节,所以最后使得结构体的大小为12。现在我们再来看看下面的代码:

#include

typedefstructstu1

{

chararray[7];

}stu1;

typedefstructstu2

{

doublefa;

}stu2;

typedefstructstu3

{

stu1 s;

charstr;

}stu3;

typedefstructstu4

{

stu2 s;

charstr;

}stu4;

voidmain()

{

printf("sizeof(stu1)    :\t%d\n",sizeof(stu1));

printf("sizeof(stu2)    :\t%d\n",sizeof(stu2));

printf("sizeof(stu3)    :\t%d\n",sizeof(stu3));

printf("sizeof(stu4)    :\t%d\n",sizeof(stu4));

}

c语言字节强制对齐,C语言的那些小秘密之字节对齐相关推荐

  1. c语言字符串强制类型转换,C语言学习九 —头文件强制类型转换错误处理

    预处理器 C 预处理器不是编译器的组成部分,但是它是编译过程中一个单独的步骤.简言之,C 预处理器只不过是一个文本替换工具而已,它们会指示编译器在实际编译之前完成所需的预处理.我们将把 C 预处理器( ...

  2. c语言变量强制转换,C语言——“=”中的强制类型转换

    前言:在写程序时候遇到了一些关于数据类型转换的问题,编译器也没有报错,运行时才发现数据不对,找bug花费了很多时间,但最终也发现是一些细节上的问题,特地在这里整理出一篇文章记录. 实验环境: 芯片架构 ...

  3. 计组之数据运算:8、c语言之强制类型转化、数据的存储与排序(大小端、字节对齐)

    8.c语言之强制类型转化 数据的存储与排序 大小端模式 边界对齐 数据的存储与排序 大小端模式 边界对齐

  4. c语言强制4字节对齐,C语言字节对齐4

    非字节对齐类型的字节对齐规则 我们可以使用"__packed"."__attribute__((packed))"."#pragma"等方式 ...

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

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

  6. 【C语言】结构体类型和结构体变量(字节对齐)

    目录 一.结构体类型定义 二.结构体变量的定义 ①先定义结构体类型,再定义结构体变量 ②在定义结构体类型的同时,定义结构体变量 ③直接定义结构体变量 三.结构体变量的内存分配 四.结构体变量的初始化 ...

  7. 语言结构体在内存的分布_结构体内存对齐,这篇文章给你彻底搞会!(干货收藏)...

    脚本之家 你与百万开发者在一起 公众号:C语言编程 作者:薛定谔的coding猫 一.内存对齐的原因  1.平台原因(移植原因):一些资料上是这样说的,"不是所有的硬件平台都能访问任意地址上 ...

  8. 字节青训营Go语言学习第一天--基础语言+实战案例

    文章目录 走进Go语言基础语言 2.2基础语言-变量 2.3基础语法- if else 2.4基础语法-循环 基础语法-switch 基础语法-数组 基础语法-切片 基础语法-map 基础语法-ran ...

  9. c语言地址强制转为指针,C语言:指针类型强制性转换

    C语言:指针类型强制性转换 标签:C语言 指针 强制性转换 by 小威威 1.引入 我们知道,每个变量都有对应的地址,地址的距离即为地址之差.然而,地址类型不同,也就不能进行减法运算.假如,我现在要求 ...

  10. c语言字节写入文件,C语言文件操作

    所谓文件(file)一般指存储在外部介质上数据的集合,比如我们经常使用的mp3.mp4.txt.bmp.jpg.exe.rmvb等等.这些文件各有各的用途,我们通常将它们存放在磁盘或者可移动盘等介质中 ...

最新文章

  1. 只需几步,U盘就能变“光驱”
  2. yum error: rpmdb: BDB0113 Thread/process
  3. 16行代码AC_【第十届蓝桥杯省赛c/c++B组真题解析】7.完全二叉树的权值
  4. thinkphp仿素材火教程_国外都用古风效果图获奖了,为什么你连素材都没有?
  5. 不稳定学习器适合做基分类器_分类稳定性
  6. java固定数组_Java在固定长度的数组里加入一个数
  7. JAVA基础知识(四):final关键字
  8. 优化网站性能 提高网站速度访问速度的14条实践(转)
  9. html5 history解决ajax不能加入历史记录的问题
  10. 机器学习(7)——Logistic回归(从疝气病症预测病马的死亡率)
  11. 75道常见AI面试题,看看你的知识盲点在哪?(附解析,包括机器学习、深度学习、苹果Google面试等)...
  12. Elasticsearch模块功能之-索引分片分配(Index shard allocation)
  13. endpt matlab,将SDPT3配置到matlab
  14. 软考-嵌入式系统设计师-笔记:嵌入式系统软件基础知识
  15. T229473 D. 背单词的小智 (二分
  16. 如何免ROOT,实现安卓设备远程控制?
  17. 怎么快速做动态图?gif动图在线怎么制作?
  18. windows下vscode安装kubernetes环境并打开阿里云CSK
  19. http://www.cnblogs.com/zyw-205520/p/3762954.html
  20. 教你用多功能打印晨曦记账本账目

热门文章

  1. leetcode哈希表(python与c++)
  2. 【itext学习之路】--5.对pdf进行盖章/签章/数字签名
  3. Spring Data JPA 从入门到精通~方法的查询策略设置
  4. C++学习之路 | PTA乙级—— 1013 数素数 (20分)(精简)
  5. js中立即执行函数会预编译吗_JavaScript预编译过程
  6. python 四足机器人运动学_撸了个四足机器人
  7. python中ht表示什么_如何看待某国内大公司Python面试题,有关dict中初始化为固定值?...
  8. PID控制器改进笔记之一:改进PID控制器之参数动态调整
  9. mysql的DbUtils_Dbutils操作mysql
  10. 软件工程讲义 9 创新的出路 走进作坊