c语言内存对齐问题

#include <stdio.h>

#pragma pack(4)
struct stu
{
char a;
short b;
int c;
char d;
};
int main()
{
printf("%d ", sizeof(struct stu));
return 0;
}
#pragma pack(4) // pack(n) n=2^n
windows默认值8 linux 默认值是4

在c语言中struct结构体中存储对齐有几个重要条件:

1、每个成员按其类型的方式对齐,char的对齐值为1,short对齐值为2,int为4 ----单位字节

2、struct长度必须是成员中最大的对齐值的整数倍(不够就补空字节),以便在处理数据时保证每一项都边界对齐

注:除了以上两条,还要考虑编译器中字节对齐的大小
/*
 1、取pack(n) n=4

  取结构体中最大的成员数据类型(在这个结构体中字节数最大的数据类型int)即m=4

  取小得 k= (m<n ? m:n) ,k=4即为外对齐的原则
 
2、取结构体成员中的每个元素类型大小x,同k比
  (x)依次取小,作为内存对齐的原则,
 3、所谓的对齐,即假设起始地址为0,能被x整除者即为对齐。

*/

根据上面的算法:在Linux默认值为4,n=4,m=4;得到结果k也等于4,每个结构体成员对应的x的大小分别为:1,2,4,1

假设结构体起始地址为0,结果如图所示,略丑,请见谅:

原文地址:https://www.cnblogs.com/chuanyang/p/5305745.html