C语言union类型成员赋值后输出结果重复的原因是什么
为什么输出结果会重复
这个现象是C语言union(联合体)类型的固有内存特性导致的,不属于运行错误。
联合体的内存规则
联合体和结构体的内存分配逻辑有本质区别:
- 联合体的所有成员共用同一块连续内存,所有成员的内存起始地址完全一致
- 联合体的总大小等于其内部占用空间最大的成员的大小,示例代码中两个成员均为长度30的字符数组,因此测得联合体大小为30字节,完全符合语言规范。
输出重复的直接原因
代码执行时的内存变化逻辑:
- 第一次调用
strcpy给first_name赋值"Monjed"时,数据被写入共享内存的起始位置,包含字符串末尾的\0结束符,共占用前7字节空间,此时内存开头存储的内容为"Monjed"。 - 第二次调用
strcpy给last_name赋值"Salih"时,写入位置仍然是共享内存的起始位置,"Salih"加结束符共占6字节,直接覆盖了之前写入的"Monjed"内容。 - 后续打印
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
相关产品推荐
相关产品推荐

