关于C语言中结构体大小计算

结构体大小的计算,。网上说法一大堆还都不一样分什么对齐不对齐,偏移量什么的。。

在此稍微举例简单总结下:

对齐原则:每一成员的结束偏移量需对齐为后一成员类型的倍数

补齐原则:最终大小补齐为成员中最大值的倍数

拿个题目做例子:【(开始偏移量)+此处字节 = 结束偏移量】

 1 struct MyStruct
 2 {
 3     int i; // (0) + 4 = 4,后面一个为2,已经对齐
 4     char c;  // (4) + 2 = 6,后面一个为结构体,直接拆开看第一个,int=4,所以对齐为(4) + 4 = 8
 5     struct InnerStruct
 6     {
 7         int i;  // (8) + 4 = 12,下一个为4,已经对齐(学java注意了,32位下C语言的long为4,和java不一样)
 8         long l;  //  (12) + 4 = 16,下一个为8,已经对齐
 9         double d;  //  (16) + 8 = 24,下一个为1,已经对齐
10         char c;  //  (24) + 1 = 25,这是最后一个,将其对齐为最大值8的倍数,所以补齐为 (24) + 8 = 32,最后结果=32
11     } innerStruct;
12 };  

【注意】如果指定对齐字节,则在对齐的时候将此指定与下一个的进行比较,取较小的那个进行对齐。

在补齐的时候,与最大的进行比较,也取较小的那一个进行补齐。

代码如下:

 1 struct A {
 2     char  b;
 3     int   a;
 4     short c;
 5 };
 6
 7 #pragma pack (2) /*指定按2字节对齐*/
 8 struct B {
 9     char  b;
10     int   a;
11     short c;
12 };
13 #pragma pack () /*取消指定对齐,恢复缺省对齐*/
14
15
16
17 #pragma pack (1) /*指定按1字节对齐*/
18 struct C {
19     char  b;
20     int   a;
21     short c;
22 };
23 #pragma pack ()/*取消指定对齐,恢复缺省对齐*/
24
25 //计算所占字节
26     int s1=sizeof(struct A);
27     int s2=sizeof(struct B);
28     int s3=sizeof(struct C);
29
30     printf("%d\n",s1);
31     printf("%d\n",s2);
32     printf("%d\n",s3);
输出结果:
12  //按下一个进行对齐,按最大进行补齐
8   //按2进行对齐和补齐 
7   //按1进行对齐和补齐,相当于直接计算每个大小然后相加

原文地址:https://www.cnblogs.com/Xieyang-blog/p/8724478.html

时间: 2024-08-06 09:33:57

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

【c语言】结构体大小计算的例子

// 结构体大小计算的例子 // 默认对齐数为4 #include <stdio.h> union tagAAA { struct { char ucFirst;//1 short ucSecond;//2 char ucThird;//1 }half; short kk;//2 }number; struct tagBBB { char ucFirst;//1 short ucSecond;//2 char ucThird;//1 short ucForth;//2 }half; struc

程序猿之---C语言细节29(#define宏大小、空结构体大小、柔性数组不知道你见过没)

主要内容:#define宏大小.空结构体大小.柔性数组 一.#define宏大小 见例子 二.空结构体大小 根编译器有关 三.柔性数组 不常用,可看看 #include <stdio.h> #define N 4 #define STR "abcd" int main() { struct student { }stu; printf("N = %d\n", sizeof(N)); printf("num 5 memery = %d\n&quo

【转】彻底搞清计算结构体大小和数据对齐原则

彻底搞清计算结构体大小和数据对齐原则 数据对齐: 许多计算机系统对基本数据类型合法地址做出了一些限制,要求某种类型对象的地址必须是 某个值K(通常是2,4或8)的倍数.这种对齐限制简化了形成处理器和存储器系统之间的接口的硬件 设计.例如,假设一个处理器总是从存储器中取出8个字节,则地址必须为8的倍数.如果我们能保 证将所有的double类型数据的地址对齐成8的倍数,那么就可以用一个存储器操作来读或者写值了. 否则,我们可能需要执行两次存储器访问,因为对象可能被分放在两个8字节存储块中. 当数据类

结构体大小的计算以及内存对其原则和修改默认对齐数

1.结构体大小的计算 **我们都知道,不论是数组还是指针都可以计算其大小, 而同样结构体也是可以计算大小的, 接下来我们就深入讨论如何计算结构体的大小.** #include<stdio.h> #includ<stdlib.h> struct s1 { char c1; int a; char c2; }; int main() { printf("%d\n", sizeof(struct s1)); system("pause"); ret

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

C/C++中不同数据类型所占用的内存大小 32位                 64位 char               1                    1 int                  4             大多数4,少数8 short              2                    2 long               4                    8 float               4              

结构体大小求值

 内存对齐概念,struct例子: struct stu{ char a; intb; char c; double d; char e; } 取pack(n),n,取结构体中最大成员大小m,取两个小值k, k = m< n?m:n; 取每个成员大小p,依次同k比较,取小值q = k< p?k:p; 第二步当中依次取得的值,即为内对齐标准,所谓的对齐,即此处的地址可被q整除. K值可作为外部对齐补0的依据. 当有数组的时候拆散了当普通变量存储. 下面开始计算结构体中的大小 取k值.(取pa

C语言中结构体内部成员的对齐

说明: ******不同的编译器和处理器,其结构体内部的成员有不同的对齐方式. ******使用sizeof()运算符计算结构体的长度. ###结构体中每个成员相对于结构首地址的偏移量都是成员大小的整数倍,如果有需要编译器会在成员之间加上填充字. ###结构体的总大小是结构体最宽基本类型成员大小的整数倍.如果需要编译器会在最后一个成员之后加上填充字. struct A { <span style="white-space:pre"> </span>unsigne

结构体大小的计算方法

****************************************************************************************** 结构体大小的计算方法: 1.结构体成员的偏移量必须是成员大小的整数倍(0被认为是任何数的整数倍). 2.结构体大小必须是所有成员大小的整数倍. ***************************************************************************************

C语言中结构体赋值问题的讨论(转载)

今天帮师姐调一个程序的BUG,师姐的程序中有个结构体直接赋值的语句,在我印象中结构体好像是不能直接赋值的,正如数组不能直接赋值那样,我怀疑这个地方有问题,但最后证明并不是这个问题.那么就总结一下C语言中结构体赋值的问题吧: 结构体直接赋值的实现 下面是一个实例: #include <stdio.h> struct Foo { char a; int b; double c; }foo1, foo2; //define two structs with three different field