结构体大小的计算,。网上说法一大堆还都不一样分什么对齐不对齐,偏移量什么的。。
在此稍微举例简单总结下:
对齐原则:每一成员的结束偏移量需对齐为后一成员类型的倍数 
补齐原则:最终大小补齐为成员中最大值的倍数
 
拿个题目做例子:【(开始偏移量)+此处字节 = 结束偏移量】
 struct MyStruct
{
int i; // (0) + 4 = 4,后面一个为2,已经对齐
char c; // (4) + 1 = 5,后面一个为结构体,直接拆开看第一个,int=4,所以对齐为(4) + 4 = 8
struct InnerStruct
{
int i; // (8) + 4 = 12,下一个为4,已经对齐(学java注意了,32位下C语言的long为4,和java不一样)
long l; // (12) + 4 = 16,下一个为8,已经对齐
double d; // (16) + 8 = 24,下一个为1,已经对齐
char c; // (24) + 1 = 25,这是最后一个,将其对齐为最大值8的倍数,所以补齐为 (24) + 8 = 32,最后结果=32
} innerStruct;
};
【注意】如果指定对齐字节,则在对齐的时候将此指定与下一个的进行比较,取较小的那个进行对齐。
                在补齐的时候,与最大的进行比较,也取较小的那一个进行补齐。
代码如下:
 struct A {
char b;
int a;
short c;
}; #pragma pack (2) /*指定按2字节对齐*/
struct B {
char b;
int a;
short c;
};
#pragma pack () /*取消指定对齐,恢复缺省对齐*/ #pragma pack (1) /*指定按1字节对齐*/
struct C {
char b;
int a;
short c;
};
#pragma pack ()/*取消指定对齐,恢复缺省对齐*/ //计算所占字节
int s1=sizeof(struct A);
int s2=sizeof(struct B);
int s3=sizeof(struct C); printf("%d\n",s1);
printf("%d\n",s2);
printf("%d\n",s3);
输出结果:
12  //按下一个进行对齐,按最大进行补齐
8   //按2进行对齐和补齐 
7   //按1进行对齐和补齐,相当于直接计算每个大小然后相加
 

关于C语言中结构体大小计算的更多相关文章

  1. C语言中结构体大小计算

    1.普通结构体 struct student { char sex; char a; char b; int age; char name[100]; }; 该结构体大小为108 解答:1.先算str ...

  2. C++字节对齐与结构体大小计算

    转载注明出处:http://pppboy.blog.163.com/blog/static/30203796201082494026399/ 感谢原创博主的辛勤成果. 说明: 结构体的sizeof值, ...

  3. struct结构体大小的计算(内存对齐)

    本次实验环境 环境1:Win10, QT 5.12 一. 背景 当普通的类型无法满足我们的需求的时候,就需要用到结构体了.结构体可衍生出结构体数组,结构体还可以嵌套结构体,这下子数据类型就丰富多彩了, ...

  4. C/C++ sizeof函数解析——解决sizeof求结构体大小的问题

    C/C++中不同数据类型所占用的内存大小 32位                 64位 char               1                    1 int           ...

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

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

  6. Windows下struct和union字节对齐设置以及大小的确定(一 简介和结构体大小的确定)

    在windows下设置字节对齐大小的方式,目前我了解有三种: 1. 在编译程序时候的编译选项  /Zp[n],如 cl /Zp4 表示对齐大小是4字节: 2. 预处理命令   #pragma pack ...

  7. Go语言中结构体的使用-第2部分OOP

    1 概述 结构体的基本语法请参见:Go语言中结构体的使用-第1部分结构体.结构体除了是一个复合数据之外,还用来做面向对象编程.Go 语言使用结构体和结构体成员来描述真实世界的实体和实体对应的各种属性. ...

  8. C语言中结构体赋值问题的讨论

    今天帮师姐调一个程序的BUG,师姐的程序中有个结构体直接赋值的语句,在我印象中结构体好像是不能直接赋值的,正如数组不能直接赋值那样,我怀疑这个地方有问题,但最后证明并不是这个问题.那么就总结一下C语言 ...

  9. C语言中的调试小技巧

    C语言中的调试小技巧 经常看到有人介绍一些IDE或者像gdb这样的调试器的很高级的调试功能,也听人说过有些牛人做工程的时候就用printf来调试,不用特殊的调试器.特别是在代码经过编译器一些比较复杂的 ...

随机推荐

  1. C#中对文件的操作小结

    1.建立一个文本文件 public class FileClass { public static void Main() { WriteToFile(); } static void WriteTo ...

  2. 删除Windows服务

    或者开始→运行 ,输入“regedit”,在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services 下找到需要删除的服务名,直接删除即可.

  3. Qt隐式共享与显式共享

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/Amnes1a/article/details/69945878Qt中的很多C++类都使用了隐式数据共 ...

  4. Date、Calendar、Timestamp的区别与转换

    1.Java.util.Date 包含年.月.日.时.分.秒信息. // String转换为Date String dateStr="2013-8-13 23:23:23"; St ...

  5. hibernate自动建表之engine设置

    1.MYSQL的数据库引擎中,只有InnoDB和BDB(Berkley DB )包括了对事务处理和外键的支持.如果数据引擎建为MyISAM则rollback无效. 2.而hibernate自动建表的时 ...

  6. pandas(八)重塑和轴向旋转

    重塑层次化索引 层次化索引为DataFrame的重排提供了良好的一致性操作,主要方法有 stack :将数据的列旋转为行 unstack:将数据的行转换为列 用一个dataframe对象举例 In [ ...

  7. vue组件的is特性

    组件功能是vue项目的一大特色.组件可以扩展html元素,可以封装可重用的代码,可以增加开发效率.它是自定义元素,vue.js的编译器为它添加特殊功能.有些情况,组件也可以是原生HTML元素的形式,以 ...

  8. LeetCode:二进制手表【401】

    LeetCode:二进制手表[401] 题目描述 二进制手表顶部有 4 个 LED 代表小时(0-11),底部的 6 个 LED 代表分钟(0-59). 每个 LED 代表一个 0 或 1,最低位在右 ...

  9. 再来一道测半平面交模板题 Poj1279 Art Gallery

    地址:http://poj.org/problem?id=1279 题目: Art Gallery Time Limit: 1000MS   Memory Limit: 10000K Total Su ...

  10. HDU - 1151 Air Raid (最小路径覆盖)

    题意:给定一个有向无环图,求最少划分几条路径,使之能够覆盖所有点. 分析:这可以转化为DAG上的最小路径覆盖问题. 路径覆盖的定义:有向图中,路径覆盖就是在图中找一些路径,使之覆盖了图中的所有顶点,且 ...