【发布时间】:2013-04-12 17:07:42
【问题描述】:
请您解释一下为什么这段代码的输出是 12 (1100b)
以及sizeof(bit1)是怎么变成4byte的???
#include <stdio.h>
#include <stdlib.h>
struct bitfield
{
unsigned a:5;
unsigned c:5;
unsigned b:6;
};
void main()
{
char *p;
struct bitfield bit1={1,3,3}; //a=00001 ,c=00011 ,b=000011
p=&bit1; // p get the address of bit1
p++; // incriment the address of p in 1
printf("%d\n",*p);
printf("%d\n",sizeof(bit1));
}
【问题讨论】:
-
您可能想查看有关成员地址、位域成员以及位域如何“特殊”的标准。我也很好奇你是如何没有从
struct bitfield *类型直接分配到char *收到 phat 警告的。 -
sizeof(bit1) 不是 2byte(16bit) 输出应该是 195(11000011b)???
-
@Anklon 编译器通常会为
structs 添加填充以用于对齐目的(以便您可以创建它们的数组)。你的编译器可能有类似#pragma pack的选项来控制它。 c-faq.com/struct/endpad.html -
C99 6.7.2.1p11 实现可以分配任何大到足以容纳位字段的可寻址存储单元。如果有足够的空间,结构中紧跟在另一个位域之后的位域将被打包到同一单元的相邻位中。如果剩余空间不足,则将不适合的位域放入下一个单元还是与相邻单元重叠是实现定义的。单元内位域的分配顺序(高位到低位或低位到高位)是实现定义的。未指定可寻址存储单元的对齐方式。
-
我建议使用
%zu打印size_t类型的值(例如sizeof表达式的结果)。
标签: c