最近我在学习union,但即使阅读了很多相关资料,仍然感到困惑。
#include<stdio.h>
union test
{
int x;
char arr[4];
int y;
};
int main()
{
union test t;
t.x = 0;
t.arr[1] = 'G';
printf("%s\n", t.arr);
printf("%d\n",t.x);
return 0;
}
我理解的是:
由于 x 和 arr[4] 共享同一块内存空间,当我们将 x 赋值为 0 时,arr 中的所有字符都被设置为 0。0 是 '\0' 的 ASCII 值。当我们使用 "t.arr[1] = 'G'" 后,arr 变为 "\0G\0\0"。当我们使用 "%s" 格式化字符串并打印时,printf 函数从第一个字符开始打印,并持续打印直到找到 '\0' 字符。由于第一个字符本身就是 '\0',所以什么也没打印出来。
我不明白的是第二个 printf 语句。
现在由于 arr[] 是 "\0G\0\0",相同的位置与 x 和 y 共享。 所以我认为 x 应该是以下内容
00000000 01000111 00000000 00000000 ("\0G\0\0")
因此 t.x 应该打印 4653056。 但它实际上打印了 18176。
我错在哪里?
这是技术上未定义的,还是由于某些愚蠢的错误或者是我缺失了某些概念??
t.x = 0x0a0b0c0d;
。 - jooparr[3]
,arr[2]
, !!!arr[1]
!!!,arr[0]
.arr[3]
,arr[2]
,**!!!**arr[1]
**!!!**,arr[0]
。 - CristiFatichar arr[4];
=>char arr[sizeof(int)];
- Stargateurprintf("%x\n",(unsigned) t.x);
,输出可能会更明显一些。 - chux - Reinstate Monica