c - union 内部的结构

标签 c struct unions

int main()
{
  union {
    struct {
      char c[2];
      char ch[2]; 
    } s;
    struct {
       int i;
       int j; 
    } st;
  } u = { (12, 1), (15, 1) };

  printf("%d %d ", u.st.i, u.st.j);
}

上面怎么打印“257 0”?

使用 {} 而不是 () 有什么区别?

最佳答案

{} 表示初始化一个子对象。

() 是对表达式进行分组的运算符,例如(1+3)*2。您混淆了使用逗号运算符,它丢弃其左侧操作数并返回右侧操作数。 (12,1)1 相同。

初始化一个 union 总是设置它的第一个成员并忽略其他的。这是因为一次只有一个成员可以存储一个值。

用标量值初始化一个数组子对象,就像传递 1 来初始化 c[2] 一样,会自动跳转到数组中。这称为大括号省略。下一个 1 将初始化数组的第二个成员。

您将 1 分配给 c[2] 中的每个字符,然后将生成的字节字符串读回为小端 int。数组 ch[2] 根本没有显式初始化;在 C++ 中它会被设置为零,但在 C 中我不完全确定。

初始化程序 { {12, 1}, {15, 1} } 不起作用,因为显然,大括号省略解释第一个 } 以关闭整个 union

初始化器 {{ {12, 1}, {15, 1} }} 会避免大括号省略并设置两个数组。 { 12, 1, 15, 1 } 应该做同样的事情。

请注意,标量值和字节字符串之间的转换是实现定义的;特别是它取决于字节顺序和 int 的大小。

关于c - union 内部的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13947728/

相关文章:

c - const-casting 是通过 union 未定义的行为吗?

c++ - 不能在嵌套结构中使用 union 元素作为 scanf() 的参数来存储所需的值

c++ - 将二进制文件多次读入结构 C++

c - 分配和获取 union 值,类型双关

c - 如何从 LightTPD CGI 应用程序获取 header ?

c - 为什么 gcov 生成 gcda 文件时只设置了可执行位?

c# - 如何在 C# 中为结构设置默认值?

c - 指针未设置为结构数组的元素

c - 这是使用 goto 的可接受方式吗?

c - 如何在C中以两种不同的数据类型(uint64_t/uint8_t[8])访问相同的内存地址?