• sizeof结构体


    规则1:结构体的对折长度为其基本数据成员的长度的最大值。

    规则2:指定边界情况下,结构体的对折长度为自身对折长度和指定对折长度中较小者。

    规则3:当行内结构体的基本数据成员的起始地址必须为其长度的整数倍。

    规则4:嵌套取对折长度的情况,里层结构体作为一个变量。

    · 使用伪指令 #pragma pack (n) ,指定n字节对齐。

    · n的有效值为1、2、4、8、16等,当n=1时,结构体长度为自成员变量长度相加。

    · 使用伪指令 #pragma pack () ,取消指定。

     1 #include <stdio.h>
     2 struct{
     3     char a;
     4     int b;
     5     char c;
     6     double d;
     7 }s;
     8 #pragma pack(8)
     9 typedef struct example1
    10 {
    11     short a;
    12     long b;
    13 }example1;
    14 typedef struct example2
    15 {
    16     char c;
    17     example1 struct1;
    18     short e;
    19 }example2;
    20 #pragma pack()
    21 
    22 int main(int argc, char* argv[])
    23 {
    24     example2 struct2;
    25     printf("%d
    ",sizeof(s));
    26     printf("%d
    ",sizeof(example1));
    27     printf("%d
    ",sizeof(example2));
    28     printf("%d
    ",(unsigned int)(&struct2.struct1) - (unsigned int)(&struct2));
    29     return 0;
    30 }

     1 #include <stdio.h>
     2 #pragma pack(2)
     3 typedef struct example1
     4 {
     5     short a;
     6     long b;
     7     double c;
     8 }example1;
     9 #pragma pack()
    10 #pragma pack(4)
    11 typedef struct example2
    12 {
    13     char c;
    14     example1 struct1;
    15     short e;
    16 }example2;
    17 #pragma pack()
    18 
    19 int main(int argc, char* argv[])
    20 {
    21     example2 struct2;
    22     printf("%d
    ",sizeof(example1));
    23     printf("%d
    ",sizeof(example2));
    24     printf("%d
    ",(unsigned int)(&struct2.struct1) - (unsigned int)(&struct2));
    25     return 0;
    26 }

    规则5:嵌套结构体内一字节对齐时,一字节追加。二字节对齐时,二字节追加。

     1 #include <stdio.h>
     2 #pragma pack(2)//1、2
     3 typedef struct example1
     4 {
     5     char d;
     6     short a;
     7     long b;
     8     double c;
     9 }example1;
    10 #pragma pack()
    11 #pragma pack(4)
    12 typedef struct example2
    13 {
    14     char c;
    15     example1 struct1;
    16     double e;
    17 }example2;
    18 #pragma pack()
    19 
    20 int main(int argc, char* argv[])
    21 {
    22     example2 struct2;
    23     printf("%d
    ",sizeof(example1));
    24     printf("%d
    ",sizeof(example2));
    25     printf("%d
    ",(unsigned int)(&struct2.struct1) - (unsigned int)(&struct2));
    26     return 0;
    27 }

     补充数组:

    比如char a[3],它的对齐方式和分别写3个char是一样的.也就是说它还是按1个字节对齐.
    如果写: typedef char Array3[3];
    Array3这种类型的对齐方式还是按1个字节对齐,而不是按它的长度.
    不论类型是什么,对齐的边界一定是1,2,4,8,16....中的一个。

    C++类也遵循类似结构体的对齐规则。

  • 相关阅读:
    爬楼梯
    字母异位词分组
    发射子弹过程
    删除元素
    删除排序数组中的重复项
    JAVA编程-------------9、查找1000以内的完数
    JAVA-------------8、计算a+aa+aaa+.....
    JAVA编程----------7、统计一段字符串中的英语字母数,空格数,数字和其他字符数
    JAVA编程---------6、最大公约数和最小公倍数
    JAVA编程----------5、利用条件运算符的嵌套来完成:成绩>=90(A) 60-89(B) 60分以下(C)
  • 原文地址:https://www.cnblogs.com/shijianchuzhenzhi/p/4392076.html
Copyright © 2020-2023  润新知