文章目录
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include<stdio.h>

struct A{
char a;
int b;
short c;
}m;

struct B{
int b;
char a;
short c;
}n;

int main(){
printf("%d\n", sizeof(m));
printf("%d\n", sizeof(n));
return 0;
}

不知道有多少人,知道程序运行的结果?

答案是12:8.不明白怎么回事的请往下看。

首先说一下内存对齐的规则:

各成员变量存放的起始地址相对于结构的起始地址的偏移量必须为该变量的类型所占用的字节数的倍数。
在数据成员完成各自对齐之后,结构(或联合)本身也要进行对齐,对齐将按照#pragma pack指定的数值和结构(或联合)最大数据成员长度中,比较小的那个进行。

对于第一种情况:
a是1个字节,所以a在占据第0位,然后是b是4个字节,所以首地址与其实地址的偏移量必须是4的倍数是4,所以1,2,3系统自动填充别的字符,然后是c是两个字节,首地址是8,所以就变成了10个字节,这样,第一条规则结束了。然后看第二个规则,最大的成员变量是int,4个字节,#pragma pack默认的是8个字节,选比较小的是4,所以,还要补充2个字节,所以一共12个字节。

第二种就留给读者自己处理了。

文章目录