结构体字节对齐的例外

有一个题目,问的是以下代码的运行结果

#include <stdio.h>
#include <string.h>
struct T{
        char str[11];
};
int main(int argc,char *argv[])
{
    struct T s;

    printf("sizeof(s) = %d\n", sizeof(s));
    return 0;
}

按照以往的经验,我觉得他会按照4字节对齐,但是这个结果是11,为什么?

查阅资料才发现,当结构体中只有一个成员(这里是char数组,我测试了short数组他也不会按照4字节对齐)时,他不会按照字节对齐,这个结构体的大小就是这个数组的大小。

但是当里面有其他成员的时候情况就不一样了,这就要遵循字节对齐原则了。如下面代码所示

#include <stdio.h>
#include <string.h>
struct T{
        char str[11];
    	int a;   //加了这一行
};
int main(int argc,char *argv[])
{
    struct T s;

    printf("sizeof(s) = %d\n", sizeof(s));
    return 0;
}

加上这一行,结果时多少呢?

这时候就需要按照字节对齐来处理,首先先11个字节的str数组会占11个字节,然后空一个字节来对齐。然后从第13个字节开始就是a这个变量。所以下面这段代码的结果是16