MST

星途 面试题库

面试题:C语言联合体在复杂场景下的初始化与访问

定义一个包含联合体的结构体,联合体中有`int`、`double`和`char`数组成员。结构体还有一个枚举成员,用于标识当前联合体中有效的成员类型。编写一个函数,根据传入的不同枚举值,正确初始化联合体并返回该结构体。在主函数中调用该函数并输出联合体的相应成员值。解释在这种设计下如何避免访问未初始化的联合体成员。
32.9万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试
#include <stdio.h>

// 定义枚举类型
typedef enum {
    TYPE_INT,
    TYPE_DOUBLE,
    TYPE_CHAR_ARRAY
} UnionType;

// 定义联合体
typedef union {
    int i;
    double d;
    char arr[10];
} MyUnion;

// 定义结构体
typedef struct {
    MyUnion u;
    UnionType type;
} MyStruct;

// 初始化结构体的函数
MyStruct initializeStruct(UnionType type) {
    MyStruct s;
    s.type = type;
    switch (type) {
        case TYPE_INT:
            s.u.i = 42;
            break;
        case TYPE_DOUBLE:
            s.u.d = 3.14;
            break;
        case TYPE_CHAR_ARRAY:
            snprintf(s.u.arr, sizeof(s.u.arr), "Hello");
            break;
    }
    return s;
}

int main() {
    // 根据不同枚举值调用函数初始化结构体
    MyStruct s1 = initializeStruct(TYPE_INT);
    MyStruct s2 = initializeStruct(TYPE_DOUBLE);
    MyStruct s3 = initializeStruct(TYPE_CHAR_ARRAY);

    // 输出联合体相应成员值
    if (s1.type == TYPE_INT) {
        printf("s1.u.i: %d\n", s1.u.i);
    }
    if (s2.type == TYPE_DOUBLE) {
        printf("s2.u.d: %lf\n", s2.u.d);
    }
    if (s3.type == TYPE_CHAR_ARRAY) {
        printf("s3.u.arr: %s\n", s3.u.arr);
    }

    // 解释如何避免访问未初始化的联合体成员
    // 通过结构体中的枚举成员来标识当前联合体中有效的成员类型
    // 在访问联合体成员前,先检查枚举值,确保访问的是已经初始化的成员
    // 如上述代码中,在输出联合体成员值前,先通过 `if` 语句判断枚举值

    return 0;
}

在这种设计下,通过结构体中的枚举成员 type 来标识当前联合体中有效的成员类型。在访问联合体成员之前,先检查 type 的值,确保访问的是已经初始化的成员,从而避免访问未初始化的联合体成员。例如,在 main 函数中,输出联合体成员值之前,使用 if 语句判断 type 的值,只有对应类型的联合体成员被初始化时才进行输出。