sizeof()结构体对齐

struct Test1
{
char    name;
int     score;
Student *pNext;
};
struct Test2
{
char    name[3];
int     score;
Student *pNext;
};
struct Test3
{
char    name[6];
int     score;
Student *pNext;
};
struct Test4
{
char    name[30];
int     score;
Student *pNext;
};
void main()
{
    int len = sizeof(Test1);   //len = 12
    int len = sizeof(Test2);   //len = 12
    int len = sizeof(Test3);   //len = 16
    int len = sizeof(Test4);   //len = 40
}
//VS2008,编译器会将char    name[n];对齐为sizeof(int)的倍数。也就是4的倍数,如果不够4的倍数会+上最小的数字达到4的倍数。
因为这个结构体内占字节数最大的基本类型是int.

再举例,如果是这样
struct Test1
{
char    name[10];
int     score;
char    oldName;
};

struct Test2
{
char    name[10];
short     score;
char    oldName;
};
void main()
{
    int len = sizeof(Test1);   //len = 20
    int len = sizeof(Test2);   //len = 14
}
test1 把结构体内的属性以sizeof(int)对齐,char name[10]补齐到12,char    oldName补齐
到4,所以12 + 4 +4 =20。
test2以sizeof(short)对齐,10 = sizeof(name)已经是2的倍数,不用补齐。所以是12 + 2 + 2
=14

顺序的影响

typedef struct _AAA
{
char b;
double a;
char c;
}AAA;

typedef struct _AAA
{
char b;
char c;
double a;

}AAA2;

void main()
{
len = sizeof(AAA);          //len 24
len = sizeof(AAA2);        //len 16
}

原文地址:https://www.cnblogs.com/yuzhould/p/4454994.html