结构体问题

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;
}
上一篇:sizeof和strlen的区别


下一篇:一些简单排序算法的c语言描述