sizeof结构体
规则1:结构体的对折长度为其基本数据成员的长度的最大值。
规则2:指定边界情况下,结构体的对折长度为自身对折长度和指定对折长度中较小者。
规则3:当行内结构体的基本数据成员的起始地址必须为其长度的整数倍。
规则4:嵌套取对折长度的情况,里层结构体作为一个变量。
· 使用伪指令 #pragma pack (n) ,指定n字节对齐。
· n的有效值为1、2、4、8、16等,当n=1时,结构体长度为自成员变量长度相加。
· 使用伪指令 #pragma pack () ,取消指定。
#include <stdio.h>
struct{
char a;
int b;
char c;
double d;
}s;
#pragma pack(8)
typedef struct example1
{
short a;
long b;
}example1;
typedef struct example2
{
char c;
example1 struct1;
short e;
}example2;
#pragma pack() int main(int argc, char* argv[])
{
example2 struct2;
printf("%d\n",sizeof(s));
printf("%d\n",sizeof(example1));
printf("%d\n",sizeof(example2));
printf("%d\n",(unsigned int)(&struct2.struct1) - (unsigned int)(&struct2));
return ;
}

#include <stdio.h>
#pragma pack(2)
typedef struct example1
{
short a;
long b;
double c;
}example1;
#pragma pack()
#pragma pack(4)
typedef struct example2
{
char c;
example1 struct1;
short e;
}example2;
#pragma pack() int main(int argc, char* argv[])
{
example2 struct2;
printf("%d\n",sizeof(example1));
printf("%d\n",sizeof(example2));
printf("%d\n",(unsigned int)(&struct2.struct1) - (unsigned int)(&struct2));
return ;
}

规则5:嵌套结构体内一字节对齐时,一字节追加。二字节对齐时,二字节追加。
#include <stdio.h>
#pragma pack(2)//1、2
typedef struct example1
{
char d;
short a;
long b;
double c;
}example1;
#pragma pack()
#pragma pack(4)
typedef struct example2
{
char c;
example1 struct1;
double e;
}example2;
#pragma pack() int main(int argc, char* argv[])
{
example2 struct2;
printf("%d\n",sizeof(example1));
printf("%d\n",sizeof(example2));
printf("%d\n",(unsigned int)(&struct2.struct1) - (unsigned int)(&struct2));
return ;
}

补充数组:
比如char a[3],它的对齐方式和分别写3个char是一样的.也就是说它还是按1个字节对齐.
如果写: typedef char Array3[3];
Array3这种类型的对齐方式还是按1个字节对齐,而不是按它的长度.
不论类型是什么,对齐的边界一定是1,2,4,8,16....中的一个。
C++类也遵循类似结构体的对齐规则。
sizeof结构体的更多相关文章
- sizeof(结构体)的计算
摘要: 经常被计算结构体的sizeof给搞晕,于是找了个时间,静下心来,搞定它. 一.为什么结构体计算这么乱? 答案是字节对齐,计算机存储系统中以Byte为单位存储数据,不同数据类型所占的空间不同,如 ...
- sizeof(结构体)和内存对齐以及位域
Win32平台下的微软C编译器的对齐策略: 1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除: 备注:编译器在给结构体开辟空间时,首先找到结构体中最宽的基本数据类型,然后寻找内存地址能被该 ...
- 全面总结sizeof的用法(定义、语法、指针变量、数组、结构体、类、联合体、位域位段)
一.前言 编译环境是vs2010(32位). <span style="font-size:18px;">#include<iostream> #inclu ...
- C++结构体中sizeof(1)
sizeof sizeof操作符的作用是返回一个对象或类型名的长度,长度的单位是字节. 返回值的类型是标准库命名为size_t的类型,size_t类型定义在cstddef头文件中,该头文件是C标准库的 ...
- 结构体变量的sizeof计算
结构体字节对齐准则: 1. 结构体变量的首地址能够被其最宽基本类型成员的大小所整除: 2. 结构体每个成员相对于结构体首地址的偏移量都是当前成员大小的整数倍,如有需要编译器会在成员之间加上填充字节: ...
- C++面试常见问题——13结构体与共用体的sizeof
结构体与共用体的sizeof 结构体的sizeof 结构体变量占用的内存空间大小通常是其基本类型的大小,但是由例外(字节对齐机制) struct S1{ char c[5]; int a; doubl ...
- C语言中结构体对齐问题
C语言中结构体对齐问题 收藏 关于C语言中的结构体对齐问题 1,比如: struct{short a1;short a2;short a3;}A;struct{long a1;short a2;}B; ...
- C++之 自定义数据类型 枚举、结构体、共用体
1.枚举 枚举类型的声明形式为: enum 枚举类型名 { 变量值列表 }; 变量值列表里都是整型变量,另外不要忘记最后面的分号! 比如,enum weekday { sun, ...
- C语言中 不定义结构体变量求成员大小
所谓的求成员大小, 是求成员在该结构体中 用 sizeof(结构体名.结构体成员名) 求来的. 很多时候我们需要知道一个结构体成员中的某个成员的大小, 但是我们又不需要定义该结构体类型的变量(定义的话 ...
随机推荐
- java 日期的格式化 输入/输出
想要得到形如2018.07.09的格式化好的当天日期 创建Date对象,调用SimpleDateFormat对象的format方法: indexstr="logstash-"+ne ...
- [luogu4234]最小差值生成树
[luogu4234]最小差值生成树 luogu 从小到大枚举边,并连接,如果已连通就删掉路径上最小边 lct维护 \(ans=min(E_{max}-E_{min})\) #include<b ...
- Mysql数据库(表)的导出和导入小结
Why? 有人因为想看导出的开房记录库文件,然后学会了Mysql数据库文件的导入操作~: 有人因为工作原因,要用到数据库的备份与导入,然后应需学会了骚操作~: 我因为~~emmm 想看某个导出的库文件 ...
- 我的Android进阶之旅------>解决AES加密报错:java.security.InvalidKeyException: Unsupported key size: 18 bytes
1.错误描述 今天使用AES进行加密时候,报错如下所示: 04-21 11:08:18.087 27501-27501/com.xtc.watch E/AESUtil.decryptAES:55: j ...
- Part01、memcache 缓存
Python操作 RabbitMQ.Redis.Memcache.SQLAlchemy 目录 一. Memcached Memcached安装和基本使用 Python操作Memcached2.1 se ...
- 编程语言的介绍(Day2)
1.什么是编程,为什么要编程? 编程==编写程序(写代码) 2.编程语言有哪些 机器语言 优点是最底层,速度最快,缺点是最复杂,开发效率最低 汇编语言 优点是比较底层,速度最快,缺点是复杂,开发效率最 ...
- Python-装饰器、生成器
python中的for循环 for i in [1,2,3,4]: print(i) 正常可运行的,但是如下运行呢? for i in 1234 print(i) 结果: Traceback (mos ...
- PAT 天梯赛 L1-001 【水】
L1-001. Hello World 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 这道超级简单的题目没有任何输入. 你只需要在一行中输 ...
- 使用curl 命令模拟POST/GET请求
https://blog.csdn.net/u012340794/article/details/71440604 curl命令是一个利用URL规则在命令行下工作的文件传输工具.它支持文件的上传和下载 ...
- hadoop19---动态代理
Action调用service里面的方法,动态代理:改变方法的实现在方法前后加逻辑不是加新方法. 在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于Io ...