【发布时间】:2013-12-12 11:37:26
【问题描述】:
我对整个“数据对齐”的事情感到非常困惑:
#include <stdio.h>
int main(){
struct st{
int i,*p;
char c;
union { char type[4]; unsigned char d;} un;
};
struct st s1={25,&a,'X',"asdf"};
printf("sizeof s1 is %d",sizeof(s1));
return 0;
}
由于数据对齐,我认为由于大小
int i : 4 bytes
int *p : 8 bytes
char c : 1 byte(+3)
union : 4 bytes
输出将是 20,但这会输出 sizeof s1 is 24!
为什么输出24?这是否与int *p有关,即8字节?
【问题讨论】:
-
sizeof和struct(分配给它的内存量)不一定是其各部分大小的总和。编译器可能会填充它的一部分(比您指出的要多)。或者它可能会将其四舍五入为 8 的倍数。例如,请参阅stackoverflow.com/questions/119123/… -
根据下面的答案,你应该把
p的声明放在前面,或者检查你的编译器是否有相关的#pragmas。 -
@EricJablow:如果你把
p放在前面,大小仍然是24。你可以自己检查。 -
我作为原创提出的问题是关于 C++ 的,但它只涉及普通的旧数据,所以它涵盖了 C 的情况。