1

我正在使用 C 中的位域,但不明白它们发生了什么。我创建了这段代码,但我不明白为什么会像往常一样出现不同的事情。

struct tB
{ 
unsigned b1:3;
signed b2:6;
unsigned b3:11;
signed b4:1;
} b;


int main(void)
{ 
struct tB *p;

printf("%d\n", sizeof(*p));
}

为什么当我打印出来时*p会得到4as *p

让我们说我试图得到sizeof(b),我怎么会想出这个?

4

3 回答 3

3

sizeof(b)将为您提供类型变量的大小(以字节为单位)struct tB,在这种情况下将为 4(由于padding它不会像预期的那样为 3)

sizeof(*p)将再次为您提供类型变量的大小(以字节为单位)。您应该使用类型变量的地址进行struct tB初始化。例如:pstruct 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));
}
于 2013-04-30T05:55:08.510 回答
1

你有 21 位,四舍五入到最接近的int,你得到 32(即 4 个字节)。

于 2013-04-30T05:35:17.577 回答
0

这都是关于处理器字的。访问内存的处理器无法访问它,比如说 1 或 2 个字节。它逐字逐句。通常,编译器会正确对齐结构以符合字对齐。通常,尽管处理器寄存器的大小,这种对齐等于处理器架构。因此,在您的情况下,您具有与一个单词对齐的 21 位结构。如果您将结构调整为 33 位长,您将有 2 字对齐,并且在您的案例中程序将打印 8。

Here Wikipedia 上与此Data structure alignment相关的文章。

于 2013-04-30T06:56:03.077 回答