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(结构体名.结构体成员名) 求来的. 很多时候我们需要知道一个结构体成员中的某个成员的大小, 但是我们又不需要定义该结构体类型的变量(定义的话 ...
随机推荐
- 文件下载(StreamingHttpResponse流式输出)
文件下载(StreamingHttpResponse流式输出) HttpResponse会直接使用迭代器对象,将迭代器对象的内容存储成字符串,然后返回给客户端,同时释放内存.可以当文件变大看出这是一个 ...
- gophercloud openstack networking 源码分析
1.network 部分 // Package networks contains functionality for working with Neutron network resources. ...
- javascript教程5:--BOM操作
1.BOM 简介 所谓的 BOM 即浏览器对象模型(Browser Object Model).BOM 赋予了 JS 操作浏览器的能力,即 window 操作.DOM 则用于创建删除节点,操作 HTM ...
- 流畅的python 闭包
闭包 人们有时会把闭包和匿名函数弄混.这是有历史原因的:在函数内部定义函数不常见,直到开始使用匿名函数才会这样做.而且,只有涉及嵌套函数时才有闭包问题.因此,很多人是同时知道这两个概念的.其实,闭包指 ...
- Linux学习笔记(10)linux网络管理与配置之一——主机名与IP地址,DNS解析与本地hosts解析(1-4)
Linux学习笔记(10)linux网络管理与配置之一——主机名与IP地址,DNS解析与本地hosts解析 大纲目录 0.常用linux基础网络命令 1.配置主机名 2.配置网卡信息与IP地址 3.配 ...
- PHP 安装memcache.so 和memcached.so
一.memcache.so 的安装 wget http://pecl.php.net/get/memcache-2.2.7.tgztar zxvf memcache-2.2.7.tgz./config ...
- java 多线程 day06 threadLocal
import java.util.HashMap;import java.util.Map;import java.util.Random; /** * Created by chengtao on ...
- Github 的其他用法
一.概述 Github 除了作为代码托管库外,有趣的程序员们还利用它解锁了有趣的新姿势. 二.新姿势 2.1 Github Pages 可以为项目建立静态主页(即gh-pages分支), 也可以建立命 ...
- Divide by Zero 2017 and Codeforces Round #399 (Div. 1 + Div. 2, combined) A. Oath of the Night's Watch
地址:http://codeforces.com/problemset/problem/768/A 题目: A. Oath of the Night's Watch time limit per te ...
- POJ 1659 Frogs' Neighborhood (Havel定理构造图)
题意:根据图的度数列构造图 分析:该题可根据Havel定理来构造图.Havel定理对可图化的判定: 把序列排成不增序,即d1>=d2>=……>=dn,则d可简单图化当且仅当d’={d ...