c语言中结构体使用是非常广泛的,但是结构体有一个问题,就是如果开头的字段属性是字符类型(char),紧跟着的是其他类型,比如整型、长整型、双精度、浮点型,这时候结构体的大小会发生改变,下面给出一个示例:
#include <stdio.h>
struct person{
char sex;
int age;
char name[8];
};
int main()
{
printf("sizeof(person) = %d\n",sizeof(struct person));
return 0;
}
这个示例很简单,就是定义一个结构体,三个属性:分别是char类型的sex,int类型的age,char\[\]类型的name,直观的看,大小应该是1+4+8=13,但是我们编译,运行,结果如下所示:
# clang hello.c -o hello
# ./hello
sizeof(person) = 16
开始的char并不会被分配1byte,而是4byte,是为了和相近的int对齐,这就是c语言结构体的内存对齐的具体表现,在linux下,可以通过增加\_\_attribute\_\_((\_\_packed\_\_))在结构体声明的地方,修改上述代码,如下所示:
![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ZlaW5pZmk_size_16_color_FFFFFF_t_70][]
程序运行,最终的打印结果是13,符合我们原来的预期。
还有一种修改办法,就是指定字段对齐大小为1,如下所示:
![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ZlaW5pZmk_size_16_color_FFFFFF_t_70 1][]
这两种办法,好像只有在linux下才会生效,在windows下这种办法会报语法错误。
还没有评论,来说两句吧...