C-内存对齐之结构体的大小

需求定制 需求定制 主题:1050 回复:2283

C-内存对齐之结构体的大小

归属感 发布于 2017-03-27 字数 165 浏览 1002 回复 2

struct a
{
char *m;
int t;
double c;

}m;
对于sizeof(m),会因t,c和指针变量m的位置变换而变化,这到底是怎么回事?

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

支持 Markdown 语法,需要帮助?

评论(2

泛泛之交 2017-08-28 2 楼

同时VC为了确保结构的大小为结构的字节边界数(即该结构中占用最大空间的类型所占用的字节数)的倍数, 所以在为最后一个成员变量申请空间后,还会根据需要自动填充空缺的字节。

默认情况下编译器结构体的最大倍数值设置最大为8,也就是说如果你结构体中的元素有超过八个字节的,编译器也是会以八个字节作为对齐。

这个值可以采用 #pragma pack(x) 来设定

灵芸 2017-06-19 1 楼

一般来说在windows下32位编译器,如VC 6.0
char *是4字节,int是4字节,double是8字节,总共是16字节。
(字节对齐) 在默认情况下,VC规定各成员变量存放的起始地址相对于结构的起始地址的偏移量必须为该变量的类型所占用的字节数的倍数
但是当

struct a
{
char *m;
double c; //这里是double在中间
int t;
}m;

同时VC为了确保结构的大小为结构的字节边界数(即该结构中占用最大空间的类型所占用的字节数)的倍数, 所以在为最后一个成员变量申请空间后,还会根据需要自动填充空缺的字节。
这种情况下,由于double是8字节,所以c的偏移量必须是8,m本来是占4个字节的,其他的4个字节用来填充,才能是的c的偏移量是8。t本来也是4个字节的,后面会有4个字节进行填充,最后结果是24字节了。你可以通过

struct a m;
int c=0;
printf("%dn",sizeof(m));
printf("m.m=%xn",&m.m);
printf("m.c=%xn",&m.c);
printf("m.t=%xn",&m.t);
printf("c=%xn",&c);

来看结构体里面的每个元素的起始地址就知道了。希望对你有帮助