相关疑难解决方法(0)

为什么我们需要C联盟?

什么时候应该使用工会?我们为什么需要它们?

c unions

222
推荐指数
10
解决办法
12万
查看次数

以下C联合访问模式是否未定义行为?

以下是现代C中未定义的行为:

union foo
{
    int i;
    float f;
};
union foo bar;
bar.f = 1.0f;
printf("%08x\n", bar.i);
Run Code Online (Sandbox Code Playgroud)

并打印1.0f的十六进制表示.

但是以下是未定义的行为:

int x;
printf("%08x\n", x);
Run Code Online (Sandbox Code Playgroud)

那这个呢?

union xyzzy
{
    char c;
    int i;
};
union xyzzy plugh;
Run Code Online (Sandbox Code Playgroud)

这应该是未定义的行为,因为没有plugh编写成员.

printf("%08x\n", plugh.i);
Run Code Online (Sandbox Code Playgroud)

但是这个呢.这是未定义的行为吗?

plugh.c = 'A';
printf("%08x\n", plugh.i);
Run Code Online (Sandbox Code Playgroud)

现在大多数C编译器都有sizeof(char) < sizeof(int),sizeof(int)或者是2或4.这意味着在这些情况下,最多plugh.i会写入50%或25%,但读取剩余的字节将读取未初始化的数据,因此应该是未定义的行为.在此基础上,是整个读取未定义的行为?

c undefined-behavior unions language-lawyer type-punning

7
推荐指数
1
解决办法
320
查看次数

何时使用联合以及何时使用结构

我知道联盟和结构之间的区别.但是从设计和编码的角度来看,使用union而不是结构的各种用例是什么?一个是空间优化.使用它们还有什么好处吗?

c structure unions

5
推荐指数
2
解决办法
2万
查看次数