C语言结构体对齐
Bright-SKY 人气:0结构体对齐问题
1、知识点的引入:
struct data1 { char a;//1B int b;//4B }; void test01() { printf("%d\n",sizeof(struct data1));//8B 为啥? }
2、对齐规则(默认对齐)
第一步:确定分配单位(每行开辟多少字节)
结构体中最大的基本类型的长度 为分配单位。
第二步:确定成员的偏移位置。
偏移位置:成员自身类型的整数倍(0~n倍)
第三步:收尾工作:
结构体的总大小必须是分配单位的整数倍
struct data { char c;//1B int i;//4B }; void test05() { struct data d; //结构体的大小 >= 成员大小之和 printf("%d\n",sizeof(struct data));//8 printf("&d.c = %u\n",&d.c ); printf("&d.i = %u\n",&d.i ); }
运行结果:
案例:
typedef struct { int a; char b; short c; char d; }DATA; void test06() { DATA d; printf("%d\n", sizeof(DATA)); printf("%u\n", &d.a); printf("%u\n", &d.b); printf("%u\n", &d.c); printf("%u\n", &d.d); }
案例1:
struct data1 { char a;//1B int b;//4B };
案例2:
struct data2 { char a; short b; char c; int d; };
案例3:
struct data2 { char a; short b; short c; char d; };
案例4:
struct data2 { char a[7]; short b; int c; };
结构体嵌套结构体
第一步:确定分配单位(每行开辟多少字节)
所有结构体中最大的基本类型的长度 为分配单位。
第二步:确定成员的偏移位置。
普通成员偏移位置:成员自身类型的整数倍(0~n倍)
结构体成员的偏移量:该结构体的最大基本类型的整数倍
第三步:收尾工作:
结构体成员:是该结构体的最大基本类型整数倍。
结构体的总大小必须是分配单位的整数倍
案例:
typedef struct { short d; char e; }DATA2; typedef struct { short a; int b; DATA2 c; char f; }DATA; void test08() { DATA data; printf("%d\n",sizeof(DATA)); printf("a:%u\n", &data.a); printf("b:%u\n", &data.b); printf("c中d:%u\n",&data.c.d); printf("c中e:%u\n",&data.c.e); printf("f:%u\n",&data.f); }
案例:
typedef struct { char a; int b; short c; }DATA; void test10() { DATA data={'a',100, 20}; char *p = &data; printf("c = %hd\n", data.c); //需求 借助p访问20 printf("c = %hd\n", *(short *)(p+8)); }
运行结果:
案例:
struct A { char b; short c; }; struct B { int a; struct A ob;//结构体成员的偏移量 int d; };
案例1:
struct A { short b; char c; }; struct B { int f; char a; struct A ob;//结构体成员的偏移量 char d; };
强制内存对齐
#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("%d\n",sizeof(struct stu));//6 }
注意事项:
拓展求结构体成员的偏移量
struct stu1 { char a; int b; char c; int d; };
#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("偏移量:%d\n", OFF_SET(struct stu1, b) );//8 }
加载全部内容