规则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结构体的更多相关文章

  1. sizeof(结构体)的计算

    摘要: 经常被计算结构体的sizeof给搞晕,于是找了个时间,静下心来,搞定它. 一.为什么结构体计算这么乱? 答案是字节对齐,计算机存储系统中以Byte为单位存储数据,不同数据类型所占的空间不同,如 ...

  2. sizeof(结构体)和内存对齐以及位域

    Win32平台下的微软C编译器的对齐策略: 1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除: 备注:编译器在给结构体开辟空间时,首先找到结构体中最宽的基本数据类型,然后寻找内存地址能被该 ...

  3. 全面总结sizeof的用法(定义、语法、指针变量、数组、结构体、类、联合体、位域位段)

    一.前言 编译环境是vs2010(32位). <span style="font-size:18px;">#include<iostream> #inclu ...

  4. C++结构体中sizeof(1)

    sizeof sizeof操作符的作用是返回一个对象或类型名的长度,长度的单位是字节. 返回值的类型是标准库命名为size_t的类型,size_t类型定义在cstddef头文件中,该头文件是C标准库的 ...

  5. 结构体变量的sizeof计算

    结构体字节对齐准则: 1. 结构体变量的首地址能够被其最宽基本类型成员的大小所整除: 2. 结构体每个成员相对于结构体首地址的偏移量都是当前成员大小的整数倍,如有需要编译器会在成员之间加上填充字节: ...

  6. C++面试常见问题——13结构体与共用体的sizeof

    结构体与共用体的sizeof 结构体的sizeof 结构体变量占用的内存空间大小通常是其基本类型的大小,但是由例外(字节对齐机制) struct S1{ char c[5]; int a; doubl ...

  7. C语言中结构体对齐问题

    C语言中结构体对齐问题 收藏 关于C语言中的结构体对齐问题 1,比如: struct{short a1;short a2;short a3;}A;struct{long a1;short a2;}B; ...

  8. C++之 自定义数据类型 枚举、结构体、共用体

    1.枚举 枚举类型的声明形式为:   enum  枚举类型名   {  变量值列表 };    变量值列表里都是整型变量,另外不要忘记最后面的分号! 比如,enum  weekday   { sun, ...

  9. C语言中 不定义结构体变量求成员大小

    所谓的求成员大小, 是求成员在该结构体中 用 sizeof(结构体名.结构体成员名) 求来的. 很多时候我们需要知道一个结构体成员中的某个成员的大小, 但是我们又不需要定义该结构体类型的变量(定义的话 ...

随机推荐

  1. cocos2d-x 3.0游戏实例学习笔记《卡牌塔防》第三步---编辑器(2)---更方便很多其它操作更像编辑器

    /* 说明: **1.本次游戏实例是<cocos2d-x游戏开发之旅>上的最后一个游戏,这里用3.0重写并做下笔记 **2.我也问过木头本人啦.他说:随便写,第一别全然照搬代码:第二能够说 ...

  2. mysql 从零学习

    一 .下载MySQL 访问MySQL的官网http://www.mysql.com/downloads/ 然后在页面中会看到“MySQL Community Server”下方有一个“download ...

  3. Django-MTV(Day66)

    阅读目录 Django基本命令 视图层路由配置系统 视图层之视图函数 MTV模型 Django的MTV分别代表: Model(模型):负责业务对象与数据库的对象(ORM) Template(模板):负 ...

  4. 微信小程序组件form

    表单组件form:官方文档 Demo Code: Page({ formSubmit: function(e) { console.log('form发生了submit事件,携带数据为:', e.de ...

  5. maven自动化构建deploy

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...

  6. Hbase 布隆过滤器BloomFilter介绍

    转载自:http://blog.csdn.net/opensure/article/details/46453681 1.主要功能 提高随机读的性能 2.存储开销 bloom filter的数据存在S ...

  7. Dispose 与 close 方法 的区别

    Dispose : 释放 托管 与 非托管资源. Finalize : 释放 非托管资源. Close: 关闭资源后,可以再次使用资源.

  8. Python面试题之Super函数

    这是个高大上的函数,在python装13手册里面介绍过多使用可显得自己是高手 23333. 但其实他还是很重要的. 简单说, super函数是调用下一个父类(超类)并返回该父类实例的方法. 这里的下一 ...

  9. Zabbix linux agent 安装

    系统:Linux Centos 7.3 x64 服务:Zabbix_agent 3.0.16 一.安装Zabbix_agent 服务 1.安装zabbix 3.0 yum源 rpm -ivh http ...

  10. 20165101刘天野 2018-2019-2《网络对抗技术》Exp2 后门原理与实践

    目录 20165101刘天野 2018-2019-2<网络对抗技术>Exp2 后门原理与实践 1. 实验内容 1.1 使用netcat获取主机操作Shell,cron启动 1.2 使用so ...