C语言:含枚举的共用体函数传参时出现成员访问编译错误
问题解决与代码修正
编译错误原因
你遇到的请求访问非结构体或共用体中的成员‘Number’错误,根源是代码里的user.choice.Number写法完全错误:
user.choice是eenum类型的变量,而Number是枚举类型定义的常量,不是choice的成员。枚举常量直接通过名称访问即可,不需要通过变量。
代码修正步骤
1. 修复编译错误行
把错误的判断语句:
if(answer==user.choice.Number)
改成:
if(answer == Number)
2. 修正union的设计问题(核心优化)
你当前的union data设计存在逻辑缺陷:union的所有成员共享同一块内存空间,当你给user.x赋值时,会覆盖user.choice的内容,反之亦然,完全不符合"用enum标记类型、存储对应数据"的需求。
正确的做法是用结构体包裹枚举标记和union数据,让类型标记和数据区域拥有独立内存:
修正后的完整代码:
#include <stdio.h> #include <string.h> typedef enum{ Number = 1, String = 2, } eenum; // 结构体包裹类型标记与数据存储区 typedef struct { eenum type; union { int x; char str[10]; } data; } UserData; void display(UserData *user) { int answer; puts("Enter 1 or 2:"); scanf("%d", &answer); if(answer == Number) { user->type = Number; user->data.x = 5; printf("%d\n", user->data.x); } else if(answer == String) { user->type = String; strcpy(user->data.str, "hello"); printf("%s\n", user->data.str); } else { puts("Invalid input!"); } } int main() { UserData user; display(&user); return 0; }
3. 其他细节优化
- 改用指针传递参数:传值方式下,函数内对
user的修改不会影响主函数变量,指针传递才能保留修改结果。 - 增加非法输入分支:提升程序健壮性,避免非1/2输入导致的逻辑混乱。
- 修正
printf换行符:原代码换行符写法错误,改为标准的\n。
代码说明
- 结构体
UserData中的type成员用来标记当前存储的数据类型(数字或字符串)。 - 内部的
union data用来存储实际数据,同一时间只会使用其中一个成员,节省内存空间。 - 函数根据用户输入的1/2判断存储类型,给对应union成员赋值并打印结果。
内容的提问来源于stack exchange,提问作者user20082734
相关产品推荐
相关产品推荐

