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

C语言union类型成员赋值后输出结果重复的原因是什么

为什么输出结果会重复

这个现象是C语言union(联合体)类型的固有内存特性导致的,不属于运行错误。

联合体的内存规则

联合体和结构体的内存分配逻辑有本质区别:

  • 联合体的所有成员共用同一块连续内存,所有成员的内存起始地址完全一致
  • 联合体的总大小等于其内部占用空间最大的成员的大小,示例代码中两个成员均为长度30的字符数组,因此测得联合体大小为30字节,完全符合语言规范。

输出重复的直接原因

代码执行时的内存变化逻辑:

  1. 第一次调用strcpy给first_name赋值"Monjed"时,数据被写入共享内存的起始位置,包含字符串末尾的\0结束符,共占用前7字节空间,此时内存开头存储的内容为"Monjed"。
  2. 第二次调用strcpy给last_name赋值"Salih"时,写入位置仍然是共享内存的起始位置,"Salih"加结束符共占6字节,直接覆盖了之前写入的"Monjed"内容。
  3. 后续打印first_name和last_name时,都是从同一块内存的起始位置开始读取字符串,直到遇到\0结束,此时内存中存储的有效字符串为后写入的"Salih",因此两个输出结果完全一致。

如果需要两个成员独立存储、赋值互不影响,应当使用struct(结构体)而非union。结构体的每个成员会分配独立的内存空间,上述示例如果改用结构体定义,总大小为60字节,先后给两个名字赋值不会出现覆盖问题。

测试代码

#include <stdio.h>
#include <string.h>

union family_name
{
   char first_name[30];
   char last_name[30];
};

int main( )
{
   union family_name Family;        

   strcpy( Family.first_name, "Monjed");
   strcpy( Family.last_name,  "Salih");

   printf( "First name : %s\n", Family.first_name);
   printf( "Last name : %s\n", Family.last_name);
   printf("Size of union = %d bytes", sizeof(Family));

   return 0;
}

运行结果

First name : Salih
Last name : Salih
Size of union = 30 bytes

内容的提问来源于stack exchange,提问作者Osman Salih

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 15:06:22