c/c++语言开发共享C语言深入回顾讲解结构体对齐

结构体对齐问题1、知识点的引入:struct data1{ char a;//1b int b;//4b};void test01(){ printf(“%d “,sizeof(s

结构体对齐问题

1、知识点的引入:

struct data1  {      char a;//1b      int b;//4b  };  void test01()  {      printf("%dn",sizeof(struct data1));//8b 为啥?  }

C语言深入回顾讲解结构体对齐

2、对齐规则(默认对齐)

C语言深入回顾讲解结构体对齐

第一步:确定分配单位(每行开辟多少字节)

结构体中最大的基本类型的长度 为分配单位。

第二步:确定成员的偏移位置。

偏移位置:成员自身类型的整数倍(0~n倍)

第三步:收尾工作:

结构体的总大小必须是分配单位的整数倍

struct data  {  	char c;//1b  	int i;//4b  };  void test05()  {  	struct data d;  	//结构体的大小 >= 成员大小之和  	printf("%dn",sizeof(struct data));//8  	printf("&d.c = %un",&d.c );  	printf("&d.i = %un",&d.i );  }

运行结果:

C语言深入回顾讲解结构体对齐

案例:

typedef struct  {  	int a;  	char b;  	short c;  	char d;  }data;  void test06()  {  	data d;  	printf("%dn", sizeof(data));  	printf("%un", &d.a);  	printf("%un", &d.b);  	printf("%un", &d.c);  	printf("%un", &d.d);  }

C语言深入回顾讲解结构体对齐

案例1:

struct data1  {      char a;//1b      int b;//4b  };

C语言深入回顾讲解结构体对齐

案例2:

struct data2  {      char a;      short b;      char c;      int d;  };

C语言深入回顾讲解结构体对齐

案例3:

struct data2  {      char a;      short b;      short c;      char d;  };

C语言深入回顾讲解结构体对齐

案例4:

struct data2  {      char a[7];      short b;      int c;  };

C语言深入回顾讲解结构体对齐

结构体嵌套结构体

第一步:确定分配单位(每行开辟多少字节)

所有结构体中最大的基本类型的长度 为分配单位。

第二步:确定成员的偏移位置。

普通成员偏移位置:成员自身类型的整数倍(0~n倍)

结构体成员的偏移量:该结构体的最大基本类型的整数倍

第三步:收尾工作:

结构体成员:是该结构体的最大基本类型整数倍。

结构体的总大小必须是分配单位的整数倍

C语言深入回顾讲解结构体对齐

C语言深入回顾讲解结构体对齐

案例:

typedef struct  {  	short d;  	char e;  }data2;  typedef struct  {  	short a;  	int b;  	data2 c;  	char f;  }data;  void test08()  {  	data data;  	printf("%dn",sizeof(data));  	printf("a:%un", &data.a);  	printf("b:%un", &data.b);  	printf("c中d:%un",&data.c.d);  	printf("c中e:%un",&data.c.e);  	printf("f:%un",&data.f);  }

C语言深入回顾讲解结构体对齐

案例:

typedef struct  {  	char a;  	int b;  	short c;  }data;  void test10()  {  	data data={'a',100, 20};  	char *p = &data;  	printf("c = %hdn", data.c);  	//需求 借助p访问20  	printf("c = %hdn", *(short *)(p+8));  }

C语言深入回顾讲解结构体对齐

运行结果:

C语言深入回顾讲解结构体对齐

案例:

struct a  {      char b;      short c;  };  struct b  {      int a;      struct a ob;//结构体成员的偏移量      int d;  };

C语言深入回顾讲解结构体对齐

案例1:

struct a  {      short b;      char c;  };  struct b  {      int f;      char a;      struct a ob;//结构体成员的偏移量      char d;  };

C语言深入回顾讲解结构体对齐

强制内存对齐

#pragma pack (value)时的指定对齐值value

第一步:确定分配单位(每行开辟多少字节)

min(value,最大的基本类型的长度) 为分配单位。

第二步:确定成员的偏移位置。

偏移位置:成员自身类型的整数倍(0~n倍)

第三步:收尾工作:

结构体的总大小必须是分配单位的整数倍

#include <stdio.h>  #include<stdio.h>  #pragma pack (4)  struct stu  {      char a;      short b;      short c;  };  void test01()  {      printf("%dn",sizeof(struct stu));//6  }

注意事项:

C语言深入回顾讲解结构体对齐

拓展求结构体成员的偏移量

struct stu1  {      char a;      int b;      char c;      int d;  };

C语言深入回顾讲解结构体对齐

#include <stdio.h>  #include<stdio.h>  struct stu1  {      char a;      int b;      char c;      int d;  };  #define  off_set(type, member) (int)&(((type *)0)->member)  void test01()  {      struct stu1 data;      printf("偏移量:%dn",   off_set(struct stu1, b) );//8  }

到此这篇关于c语言深入回顾讲解结构体对齐的文章就介绍到这了,更多相关c语言结构体对齐内容请搜索<计算机技术网(www.ctvol.com)!!>以前的文章或继续浏览下面的相关文章希望大家以后多多支持<计算机技术网(www.ctvol.com)!!>!

需要了解更多c/c++开发分享C语言深入回顾讲解结构体对齐,都可以关注C/C++技术分享栏目—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/c-cdevelopment/1239163.html

(0)
上一篇 2022年9月15日
下一篇 2022年9月15日

精彩推荐