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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 00:35:20