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