面试题答案
一键面试#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
的值,只有对应类型的联合体成员被初始化时才进行输出。