在结构体中,为什么不允许初始化为0,但初始化为1是有效的代码

问题描述 投票:0回答:1
    #include <stdio.h>
    
    struct temp{
        unsigned int zero_bit : 1;
        unsigned int first_bit : 1;
    } ;
    
//    struct temp_1{
//        unsigned int zero_bit : 0;
 //       unsigned int first_bit : 0;
 //   } ;    // Code fails
   
    
    int main() {
    
        struct temp a1;
        printf("%d", a1.zero_bit); // returns 0
    
        return 0;
    }

为什么 temp1 结构会失败,而 temp 结构却不会,考虑到它们都初始化为 0。

为什么编译器给我错误的希望,即 Zero_bit 已初始化为 1,而实际上它已初始化为 0 值?

c memory struct compiler-errors
1个回答
1
投票

:
后面的数字不是初始化值,而是位域宽度(以位为单位)。

来自上面的文档链接:

宽度-
值大于或等于的整数常量表达式 为零且小于或等于基础类型中的位数。 当大于零时,这是该位字段的位数 会占据。 零值仅适用于无名位域 并且具有特殊含义:它指定了下一个位字段 类定义将从分配单元的边界开始。

(重点是我的)

struct temp
中,
1
的宽度有效,但在
struct temp_1
中,
0
的宽度无效(它不属于上述无名位字段的例外)。
这就是
struct temp_1
编译错误的原因。

另一个问题是:

struct temp a1;
printf("%d", a1.zero_bit); // returns 0

a1
未初始化,因此包含不确定的值。您看到的
0
的值只是偶然的。

© www.soinside.com 2019 - 2024. All rights reserved.