You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言union存储特性疑问:多union变量为何能保留各值?

C语言Union内存共享与多变量行为解析

第一个程序的行为原因

单个union integer类型的变量I,其内部所有成员(s/i/l)共享同一块内存空间。每次调用scanf写入不同成员时,都是在覆盖这块内存的内容:

  1. 第一次写入I.s,内存里存的是11;
  2. 第二次写入I.i,覆盖了内存,现在内容是55;
  3. 第三次写入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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 16:15:29