sizeof(b)
将为您提供类型变量的大小(以字节为单位)struct tB
,在这种情况下将为 4(由于padding
它不会像预期的那样为 3)
sizeof(*p)
将再次为您提供类型变量的大小(以字节为单位)。您应该使用类型变量的地址进行struct tB
初始化。例如:p
struct tB
struct tB *p=&b;
但是你应该知道,在这种情况下,如果你使用sizeof(p)
then 它会给出指针的大小p
,而不是 指向的变量p
。试试你的程序的这个变体:
#include<stdio.h>
struct tB
{
unsigned b1:3;
signed b2:6;
unsigned b3:11;
signed b4:1;
unsigned b5:13;
} b;
int main(void)
{
struct tB *p;
printf("%d\n%d",sizeof(*p),sizeof(p));
}
这是另一种变体,它struct tB
通过使用指令处理填充,如您所期望的那样将大小四舍五入,该#pragma pack()
指令取决于编译器(我在 Windows 上使用 CodeBlocks)。
#include<stdio.h>
#pragma pack(1)
struct tB
{
unsigned b1:3;
signed b2:6;
unsigned b3:11;
signed b4:1;
} b;
int main(void)
{
struct tB *p;
printf("%d\n%d",sizeof(*p),sizeof(p));
}