C语言--结构体与内存对齐准则简单理解

平时基本不涉及这个问题,被问起才发现没那么简单。。。

一,结构体:内存中所有类型字节之和

#include
struct icd
{
	int a;
	char b;
	double c;
};
struct cdi
{
	char a;
	double b;
	int c;
};
struct merge
{
	char a;
	cdi c;
	int b;
};
int main(void)
{//分别为16 24 40
	printf("%d %d %d\n",sizeof(struct icd),sizeof(struct cdi),sizeof(struct merge));
}

1.首先要找到结构题中所占字节数最大的类型,icd中最大字节数为8,则int为4,char为1,则为11111(注:1为本身所占字节数,0为所补字节)右起补3,则为11111,000,再加上double,则为16

2,同理,当char为1,下一个为double=8,则char右起补7,则为1,0000000,11111111,最后int=4,则末尾补4,则为1,0000000,11111111,1111,0000=24.

总结一下:结构体地址是最长基本类型的整数倍,每个地址都可以与最长类型比较,若与下个类型相加<=8,则可在末尾补齐8,否则,在当前元素补齐8。

3.结构体的嵌套,将被嵌套的结构体打散,找出最长类型,接下来按照同样方法去做就行了,如:

char=1,merge{char,cdi,int,}其中cdi最长类型为8,则为1,0000000,(11111111,11111111,11111111),1111,0000;可知为40

你可能感兴趣的:(C语言)