struct a
{
char *c;
char b;
};
sizeof(a)是什么?
答案 0 :(得分:33)
#include <stdio.h>
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.如果这样做,请小心在任何库标题之前重置打包!
答案 1 :(得分:9)
与其他一些答案所说的相反,在大多数系统上,如果没有编译指示或编译器选项,结构的大小至少为6个字节,在大多数32位系统上,为8个字节。对于64位系统,大小很容易为16个字节。对齐确实起作用;总是。单个结构的大小必须使得可以分配这些大小的数组,并且阵列的各个成员对于所讨论的处理器充分对齐。因此,如果结构的大小是其他人假设的5,那么两个这样的结构的数组将是10个字节长,并且第二个数组成员中的char指针将在奇数字节上对齐,这将是(在大多数情况下)处理器)导致性能的主要瓶颈。
答案 2 :(得分:4)
如果要手动对其进行计数,则在考虑对齐后,结构的大小就是其每个数据成员的大小。结构没有神奇的开销字节。
答案 3 :(得分:2)
确切的值是 sizeof(a) 您也可能冒险并假设在这种情况下不小于2且不大于16。
答案 4 :(得分:1)
这取决于您的体系结构以及它如何处理基本数据类型。它还取决于系统是否需要自然对齐。
答案 5 :(得分:0)
我假设你的意思是结构而不是严格,但在32位系统上,它将是5或8个字节,具体取决于编译器是否填充结构。
答案 6 :(得分:0)
我怀疑你的意思是'struct',而不是'strict','char'而不是'char'。
大小将取决于实现。在大多数32位系统上,指针可能是5到4个字节,一个用于char。我不相信对齐会在这里发挥作用。但是,如果交换'c'和'b',则大小可能会增加到8个字节。
好的,我试了一下(g ++ 4.2.3,带-g选项),得到8。
答案 7 :(得分:0)
32位系统上结构的大小应该是8个字节,因此结构的大小变为2的倍数。当声明结构数组时,这使得各个结构在正确的字节边界处可用。这是通过在结尾填充3个字节来实现的。
如果结构在char之后声明了指针,那么它的大小仍然是8个字节 但是应该添加3字节填充以保持指针(4字节元素)在4字节地址边界处对齐。
经验法则是元素应该是一个偏移量,它是字节大小的倍数,结构本身的大小应该是2的倍数。