如何找到结构的大小?

struct a { char *c; char b; }; 

sizeof(a)是什么?

 #include  typedef struct { char* c; char b; } a; int main() { printf("sizeof(a) == %d", sizeof(a)); } 

我在32位机器上得到“sizeof(a)== 8”。 结构的总大小取决于打包:在我的情况下,默认打包为4,因此’c’需要4个字节,’b’需要一个字节,剩下3个填充字节将它带到下一个4的倍数:8。如果你想改变这种打包方式,大多数编译器都有办法改变它,例如,在MSVC上:

 #pragma pack(1) typedef struct { char* c; char b; } a; 

给sizeof(a)== 5.如果这样做,请小心在任何库头之前重置打包!

与其他一些答案所说的相反,在大多数系统中,如果没有编译指示或编译器选项,结构的大小将至少为6个字节,而在大多数32位系统上,则为8个字节。 对于64位系统,大小可能很容易为16个字节。 对齐确实起作用; 总是。 单个结构的大小必须使得可以分配这些大小的数组,并且arrays的各个成员对于所讨论的处理器充分对齐。 因此,如果结构的大小是5,正如其他人假设的那样,那么两个这样的结构的数组将是10个字节长,并且第二个数组成员中的char指针将在奇数字节上对齐,这将(在大多数情况下)处理器)导致性能的主要瓶颈。

如果要手动计算它,则在考虑对齐后,结构的大小就是每个数据成员的大小。 结构没有神奇的开销字节。

确切的值是sizeof(a)
您也可能冒险并假设在这种情况下不小于2且不大于16。

这取决于您的体系结构以及它如何处理基本数据类型。 它还取决于系统是否需要自然对齐。

我假设你的意思是结构而不是严格,但在32位系统上,它将是5或8字节,具体取决于编译器是否填充结构。

我怀疑你的意思是’struct’,而不是’strict’,’char’而不是’Char’。

大小将取决于实现。 在大多数32位系统上,指针可能是5到4个字节,一个用于char。 我不相信对齐会在这里发挥作用。 但是,如果交换’c’和’b’,则大小可能会增加到8个字节。

好吧,我试了一下(g ++ 4.2.3,带-g选项),得到8。

在32位系统上,结构的大小应该是8个字节,因此结构的大小变为2的倍数。当声明结构数组时,这使得各个结构在正确的字节边界处可用。 这是通过在结尾填充3个字节的结构来实现的。

如果结构具有在char之后声明的指针,则它仍然是8字节大小,但是将添加3字节填充以保持指针(这是4字节元素)在4字节地址边界处对齐。

经验法则是元素应该是一个偏移量,它是字节大小的倍数,结构本身的大小应该是2的倍数。