C杂讲 结构体对齐

目录

知识点1 【结构体对齐问题】

知识点2【 结构体嵌套结构体】

 知识点3【 强制内存对齐】

 知识点4【 拓展求结构体成员的偏移量】


知识点1 【结构体对齐问题】

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;
};

知识点2【 结构体嵌套结构体】

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

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

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

                普通成员偏移位置:成员自身类型的整数倍(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;
};

 知识点3【 强制内存对齐】

#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
}

注意事项:

 知识点4【 拓展求结构体成员的偏移量】

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
    
}
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值