欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-03-23 10:57:16
...

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

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

#include<stdio.h>
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