C语言共用体疑问:为何a.i输出'A'的ASCII值而非默认0?
共用体成员值关联的原因解析
这事儿的核心在于共用体(union)的内存共享特性,咱们一步步拆解:
- 共用体的所有成员共用同一段内存空间,它们的起始内存地址完全相同,整个共用体的大小等于其中占用内存最大的成员的大小。比如你定义的这个共用体,假设系统里
int和float占4字节、char占1字节,那整个共用体就占4字节,a.i、a.ch、a.f都从这4字节的起始地址开始读写。 - 当你给
a.ch赋值'A'时,其实是在共用体的起始1字节内存中写入了'A'的ASCII码值——也就是二进制的0x41(十进制65)。 - 之后读取
a.i时,程序会把这块共用内存的内容(从起始地址取4字节,低1字节是0x41,高3字节要么是内存残留值要么是0,取决于初始化情况)当作整数来解析。不管是小端还是大端系统,最终解析出的整数值都会是65,所以输出printing a.i: 65。 - 至于你疑惑的“为什么不是默认值0”:共用体本身不会自动给成员初始化默认值,而且你已经通过赋值
a.ch修改了共用内存的内容,a.i读取的是被修改后的内存数据,自然不是0。
所以结论是:完全和访问/赋值a.ch有关——共用体的内存共享机制导致修改一个成员后,其他成员读取的是同一块内存的内容,自然会呈现出关联的数值。
内容的提问来源于stack exchange,提问作者Jordan
相关产品推荐
相关产品推荐

