在以下程序中,在结构中声明了未命名的位域成员。
#include <stdio.h>
struct st{
int : 1;
};
int main()
{
struct st s;
printf("%zu\n",sizeof(s)); // print 1
}
以上程序打印输出1。
为什么sizeof(s)
打印1
?
答案 0 :(得分:4)
sizeof(s)
是undefined,因为结构中没有其他命名成员。
C11 6.7.2.1(P8):
struct-or-union-specifier中struct-declaration-list的存在声明了一个新类型, 在翻译单位内。 struct-declaration-list是一系列声明 结构或联盟的成员。 如果struct-declaration-list不包含named 成员,没有匿名结构,没有匿名联盟,行为未定义。 直到终止列表的}之后,类型才是完整的,并且完成 此后。
如果你这样写:
struct st{
int : 1;
int i : 5;
};
所以,sizeof(s)
没问题,因为结构中也有名为bit-field的成员。