结构体变量成员的字节对齐
2015-09-16 21:56
381 查看
本文参考:
http://wenku.baidu.com/view/22c2627d31b765ce050814d2.html
在做一道题是发现结构体的长度并不简单的等于各成员长度之和。受限于硬件平台,为了使不同平台下都能正确读取内存单元的数据,变量需以特定的地址进行存储。需满足以下三条准则:
1、结构体变量的首地址能被其最宽基本类型成员大小所整除;
2、结构体成员相对于结构体首地址的偏移量都是成员大小的整数倍,如有需要,编译器会在成员间填充字节;
3、结构体的大小为结构体中最宽基础类型大小的整数倍。
因此x1.a的地址为0028FD88,x1.b的地址为0028FD8C,x1.c为0028FD90(相对偏移量为8能被4整除)
http://wenku.baidu.com/view/22c2627d31b765ce050814d2.html
在做一道题是发现结构体的长度并不简单的等于各成员长度之和。受限于硬件平台,为了使不同平台下都能正确读取内存单元的数据,变量需以特定的地址进行存储。需满足以下三条准则:
1、结构体变量的首地址能被其最宽基本类型成员大小所整除;
2、结构体成员相对于结构体首地址的偏移量都是成员大小的整数倍,如有需要,编译器会在成员间填充字节;
3、结构体的大小为结构体中最宽基础类型大小的整数倍。
#include<stdio.h> #include<stdlib.h> void main() { struct y { int a; char b; long c; short d; short e[5]; }x1; struct y* p; p=&x1; printf("%d,%d,%d,%d,%d\n",sizeof(x1.a),sizeof(x1.b),sizeof(x1.c),sizeof(x1.d),sizeof(x1.e)); printf("%d\n",sizeof(*p)); printf("对应地址:\n"); printf("%p,%p,%p,%p,%p\n",&x1.a,&x1.b,&x1.c,&x1.d,&x1.e); printf("%p,%p,%p,%p\n",p,p+0x200,(unsigned long *)p+0x200,(unsigned char *)p+0x200 ); printf("%p\n",p+1); system("pause"); }
因此x1.a的地址为0028FD88,x1.b的地址为0028FD8C,x1.c为0028FD90(相对偏移量为8能被4整除)
相关文章推荐
- 设计模式-行为型之备忘录模式
- 给DynamicDataDisplay添加BrokenLineGraph
- 给DynamicDataDisplay添加BrokenLineGraph
- lintcode-二叉树的层次遍历-69
- Maven仓库地址
- easyUI之tabs
- 访问修饰符
- SQL数据库端口打开
- latex:公式中的文字
- 基于SSL加密的MySQL主主复制
- 我的惠普生活之9月16号所感
- Android新闻案例clientserver达到,完全自己的新闻节目平台
- 你是一匹野马,过分留恋草原的意思
- JSP九大内置对象对应的JSP四大作用域以及session的生命周期
- JS事件学习笔记(思维导图)
- 高等计算机体系结构1-lixianfeng
- poj1236 强连通
- windows中android SDK manager安装更新sdk很慢,或者出现Done loading packages后不动甚至没有任何可用包
- 安卓中的几种形式的通知
- access.log统计/处理