返回

C语言如何计算无嵌套结构体的大小?

发布时间:2023-02-12 07:21:04 388
# 数据

/*

如何计算无嵌套结构体的大小?

由于存储变量地址对齐的问题,计算结构体大小的3条规则:

1、结构体变量的首地址,必须是结构体变量中的“最大基本数据类型成员所占字节数”的整数倍。(对齐)

2、结构体变量中的每个成员相对于结构体首地址的偏移量,都是该成员基本数据类型所占字节的整数倍。(对齐)

3、结构体变量的总大小,为结构体变量中“最大基本数据类型成员所占字节数”的整数倍(补齐)

*/

//结构体内存对齐

 

struct S1

{

   char c1;

   int a;

   char c2;

};

struct S2

{

   char c1;

   char c2;//调整顺序

   int a;

};

int main()

{

   struct S1 s1 = {0};

   printf("%d\n",sizeof(s1)); //12

   struct S2 s2 = {0};

   printf("%d\n",sizeof(s2)); //8

   return 0;

}

//计算有嵌套结构体的大小?

struct S4

{

   char c1;

   struct S3 s3;

   double d;

};

//printf("%d\n",sizeof(struct S4));

int main()

{

   struct S4 s4;

   printf("%d\n",sizeof(s4));//32

   return 0;

}

结构体的总大小是最大字节数的整数倍

设计结构体如何节省空间 又满足对齐---1.让占用空间小的变量尽量集中在一起

                                                         2.设置默认对齐数为

/*

//设置默认对齐数为4

#pragma pack(4)

struct S

{

   char c1;//1

   //3

   double d;//8

};

#pragma pack()

//取消设置默认对齐数

int main()

{

   struct S s;

   printf("%d\n",sizeof(s));//12

   return 0;

}

//设置默认对齐数为1

#pragma pack(1)

struct S1

{

   char c1;//1

   //没有浪费的空间

   double d;//8

};

#pragma pack()

//取消设置默认对齐数

int main()

{

   struct S1 s;

   printf("%d\n",sizeof(s));//9

   return 0;

}

*/

#include //196行的offsetof头文件

struct S

{

   char c;

   int i;

   double d;

};

int main()

{

  // offsetof();//用于计算结构体变量中的每个成员相对于结构体起始地址的偏移量

  printf("%d\n",offsetof(struct S,c));//0

  printf("%d\n",offsetof(struct S,i));//4

  printf("%d\n",offsetof(struct S,d));//8

  //offsetof()是一个宏

   return 0;

}

 

 

 

 

 

 

 

 

 

特别声明:以上内容(图片及文字)均为互联网收集或者用户上传发布,本站仅提供信息存储服务!如有侵权或有涉及法律问题请联系我们。
举报
评论区(0)
按点赞数排序
用户头像
精选文章
thumb 中国研究员首次曝光美国国安局顶级后门—“方程式组织”
thumb 俄乌线上战争,网络攻击弥漫着数字硝烟
thumb 从网络安全角度了解俄罗斯入侵乌克兰的相关事件时间线
下一篇
C语言字符 2023-02-12 06:49:40