-
-
[旧帖]
[讨论]C结构体对齐方式
0.00雪花
-
发表于:
2009-7-4 16:55
5106
-
主要由aoanzhishu
的问题引出http://bbs.pediy.com/showthread.php?t=92718
前边的答案不多说了,只讨论最后2个的答案。
sizeof为编译时运算符。也就是说编译器在编译的时候已经算出结果在汇编代码里已经换成固定值了。
所以说sizeof的值是多少基本上就是编译器说的算和目标机器无关。
至于结构体C编译器如何确定大小,基本原则如下。
1、取结构体中将其中所有成分展开,寻找最大的基本类型。体积最大的一个基本元素作为对齐标准。(基本元素就是C的原生类型)
2、以对齐标准对其其中的每个元素(没有展开的)。其值为sizeof的值(也就是元素在内存中存放方式)
例子:
struct{
short a1;
short a2;
short a3;
}A;
对齐标准为2,大小为2+2+2
struct{
long a1;
short a2;
}B;
对齐标准为4,大小为4+4
struct K {
char a3[5];
short a4[2];
}A;
struct L {
int a5;
char a2;
}B;
struct{
K a0;
L a1;
char l1;
}C;
A标准为2,大小为2×3+2×2;B为4大小为4+4;C标准为4大小为4×3(10的对其结果)+4×2+4=24
至于以上结论是不是C的标准规定就不了解了。VC和GCC都是这个结果。
[课程]Android-CTF解题方法汇总!