【问题标题】:Why does sizeof unnamed bitfield member structure print 1?为什么 sizeof 未命名的位域成员结构打印 1?
【发布时间】:2017-11-23 18:01:21
【问题描述】:

在下面的程序中,在结构中声明了未命名的位域成员。

#include <stdio.h>

struct st{
    int : 1;
};

int main()
{
    struct st s;
    printf("%zu\n",sizeof(s));  // print 1
}

上面的程序打印输出1。

为什么sizeof(s) 打印1

【问题讨论】:

  • 你想打印什么?
  • 因为它有 1 个字节大,我猜 ;)
  • @Bathsheba 嘿,看ideone.com/HcLohM
  • @Bathsheba, sizeof(int) 与标准无关。使用基本类型 int 声明位域对存储其值的存储单元的大小没有任何要求。
  • 我很高兴今天起床抱怨完全理智地处理毫无价值的数据类型的 UB...

标签: c structure sizeof bit-fields


【解决方案1】:

sizeof(s)undefined,因为结构中没有其他命名成员。

C11 6.7.2.1(P8):

struct-or-union-specifier 中的 struct-declaration-list 声明了一个新类型, 在翻译单元内。 struct-declaration-list 是声明的序列 结构或工会的成员。 如果 struct-declaration-list 不包含命名 成员,没有匿名结构,也没有匿名联合,行为是未定义的。 直到终止列表的 } 之后,类型才不完整,并且完成 之后。

如果你这样写:

struct st{
        int : 1;
        int i : 5;
    };

所以,sizeof(s) 可以,因为结构中也有命名位域成员。

【讨论】:

  • 完成后} sizeof(st) 将是结构声明中的 UB。
  • 即使它是 UB,它也是你的编译器强加的一个理智的行为,编译器不需要做坏事,因为某些东西不在规范中......
  • @GradyPlayer 你会将返回1 定义为“坏”还是“好”?按标准确实是UB。
  • @GradyPlayer,您似乎误解了标准的摘录。在关闭} 之后类型是完整的,这与由于结构没有命名成员、匿名结构成员或匿名联合成员而未定义程序和翻译器的行为这一事实无关。当应用于该类型时,未定义性也不限于 sizeof 运算符的结果。
  • @rsp 即使您只是在第一个字段中添加名称,sizeof 也可以。
猜你喜欢
  • 2022-04-26
  • 1970-01-01
  • 1970-01-01
  • 2021-04-08
  • 2011-12-19
  • 2021-03-02
  • 1970-01-01
  • 1970-01-01
  • 2015-04-15
相关资源
最近更新 更多