结构体问题

1.结构体非空问题

结构体在C语言里不允许是空的(但是在C++允许,而且是一字节大小)。一般情况下都说在C++里结构体和类没什么区别,但是在网上搜一下,发现深究还是有区别的(结构体与类区别优秀博客点击这里)。

2.求解结构体大小问题

1.先确定实际对其单位。
CPU周期、结构体最大成员、预编译指令(#pragma pack(n)手动设置n,只能填1 2 4 8 16)三者中最小的为实际对齐单位。
一般32位系统默认4字节对齐,64位系统默认8字节对齐。
2.除去结构体第一个成员外,其他所有成员的地址相对于结构体地址(第一个成员地址)的偏移量必须为实际内存对齐单位或自身大小的整数倍(取两者中较小的为基准)。
3.结构体整体大小必须是实际对齐单位的整数倍。
我们下面用示例说明:

#include<stdio.h>
//系统32位
struct S
{
	char a;
	short b;
};//4   short地址偏移要是2的倍数,所以和char之间空一字节,总共4字节

struct A
{
	char a;//1+3
	int b;//4
};//8  int地址偏移要是4的倍数,所以和char之间空3字节

struct B
{
	char a;//1+1
	short b;//2
	int c;//4
};//8  short地址偏移是2的倍数,所以和char之间空1字节,int地址偏移是4的倍数,前面char和short正好4字节,不需要空字节

struct C
{
	char a;//1+3
	int b;//4
	float c;//4+4
	double d;//8
};//24  char放过后,int地址偏移要是4的倍数,char会空三字节,后面double8字节,起始地址偏移要是8的倍数,所以前面占12字节,所以空出来4字节

struct D
{
	char a;//1+3
	int b;//4
	short c;//2
};//10+2 int4字节,起始地址偏移要是4的倍数,所以和char空3个字节,short地址偏移要是2的倍数,前面占8字节,不需要空字节

struct E
{
	int a;//4
	char b;//1
};//5+3 int4字节,char1字节,不需要和int之间有空字节,但是由于整个结构体要是实际对齐单位(4)的整数倍,所以char后空3字节

struct F
{
	char a;
	struct FF
	{
		char b;
		double c;
	};//16
	int d;
};//32  FF的成员b和c之间空7个字节,b地址偏移量是结构体FF中成员最大的整数倍,所以a后面空了7字节,
 //最终需要是变量最大(double)的整数倍,所以int后空4字节

struct F2
{
	char a;
	double b;
	double c;
	int d;
};//32

struct G
{
	char a;
	char b;
	char c;
	int d;
};// 8 前三个字节正常放,不需要空字节,但是int地址偏移需要是4的倍数,所以和第三个char后面有一个空字节

int main()
{
	printf("S大小:%d\n", sizeof(struct S));
	printf("A大小:%d\n", sizeof(struct A));
	printf("B大小:%d\n", sizeof(struct B));
	printf("C大小:%d\n", sizeof(struct C));
	printf("D大小:%d\n", sizeof(struct D));
	printf("E大小:%d\n", sizeof(struct E));
	printf("F大小:%d\n", sizeof(struct F));
	printf("F2大小:%d\n", sizeof(struct F2));
	printf("G大小:%d\n", sizeof(struct G));


	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

孟小胖_H

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值