C语言union存储特性疑问:多union变量为何能保留各值?
C语言Union内存共享与多变量行为解析
第一个程序的行为原因
单个union integer类型的变量I,其内部所有成员(s/i/l)共享同一块内存空间。每次调用scanf写入不同成员时,都是在覆盖这块内存的内容:
- 第一次写入
I.s,内存里存的是11; - 第二次写入
I.i,覆盖了内存,现在内容是55; - 第三次写入
I.l,再次覆盖内存,最终内容是13。
当你用printf读取三个成员时,本质都是读取同一块内存的当前值(也就是最后写入的13),所以输出全是13。
对应的代码:
#include <stdio.h> union integer { short s; int i; long l; }; int main() { union integer I; scanf("%hi", &I.s); scanf("%d", &I.i); scanf("%ld", &I.l); printf("%hi - %d - %ld ", I.s, I.i, I.l ); }
第二个程序的行为原因
你创建的三个变量S、I、L是三个完全独立的union integer实例,每个实例都拥有属于自己的独立内存块:
S的内存块只用来存储S.s的11,没有其他写入操作覆盖它;I的内存块只存储I.i的55;L的内存块只存储L.l的13。
三个实例的内存互不重叠,自然不会互相覆盖,所以printf能正确输出各自的初始值。
对应的代码:
#include <stdio.h> union integer { short s; int i; long l; }; int main() { union integer S; union integer I; union integer L; scanf("%hi", &S.s); scanf("%d", &I.i); scanf("%ld", &L.l); printf("%hi - %d - %ld ", S.s, I.i, L.l ); }
对你疑问的直接回答
没错,三个变量就是三个独立的Union,每个都有自己的共享内存空间,且每个仅存储了一个成员的值,彼此之间没有任何内存关联,因此不会出现值被覆盖的情况。
内容的提问来源于stack exchange,提问作者Talete
相关产品推荐
相关产品推荐

