【发布时间】:2020-01-10 14:38:46
【问题描述】:
代码:
#include <stdio.h>
#include <stdlib.h>
int main()
{
union {
int theInt;
char theChar;
} u1;
u1.theChar = 'A';
printf("%i\n", u1.theInt);
printf("%c\n\n", u1.theChar);
u1.theChar = "A";
printf("%i\n", u1.theInt);
printf("%c\n\n", u1.theChar);
}
给出输出:
65
A
45
-
在第一个分配中分配了字符“A”,在第二个分配中分配了数组“A”。为什么这两个赋值会导致不同的联合值?
【问题讨论】:
-
u1.theChar = "A";不能用标准编译器编译,所以这就是原因。请学习“Pointer from integer/integer from pointer without a cast” issues。 -
显然它使用 OPs 编译器编译,gcc 也可能只发出警告,但会生成二进制文件(当然,除非使用
-Werror)。 -
"A" 不是一个有效的 char 类型,它是一个字符串,如果你想打印 "A" 然后在 printf 中使用 %s 作为字符串。
-
@Ctx 没有“只有警告”之类的东西。有“它编译干净”和“它用诊断消息编译”。
-
@underscore_d 不是真的,因为这些例子谈到了
int类型而不是字符串文字。它也没有解决此代码中存在的多个联合类型双关语问题,这是第二个主要问题。我已经发布了解决这两个问题的答案。