MST

星途 面试题库

面试题:C语言中结构体与联合体结合实现数据复用

假设有一个场景,需要存储不同类型的数据,但为了节省内存空间,希望使用结构体和联合体结合的方式。例如,有时要存储一个整数,有时要存储一个浮点数,用C语言代码实现这种设计,并解释结构体和联合体如何协同工作以达到数据复用的目的。
42.2万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试
#include <stdio.h>

// 定义联合体,包含不同类型成员
union Data {
    int i;
    float f;
};

// 定义结构体,包含一个联合体和一个枚举来标识当前存储的数据类型
typedef enum {
    TYPE_INT,
    TYPE_FLOAT
} DataType;

typedef struct {
    DataType type;
    union Data data;
} Storage;

// 打印存储的数据
void printData(Storage s) {
    switch (s.type) {
        case TYPE_INT:
            printf("Stored data (int): %d\n", s.data.i);
            break;
        case TYPE_FLOAT:
            printf("Stored data (float): %f\n", s.data.f);
            break;
        default:
            printf("Unknown data type\n");
    }
}

int main() {
    Storage s1, s2;

    // 存储整数
    s1.type = TYPE_INT;
    s1.data.i = 42;
    printData(s1);

    // 存储浮点数
    s2.type = TYPE_FLOAT;
    s2.data.f = 3.14f;
    printData(s2);

    return 0;
}

结构体和联合体协同工作解释

  1. 联合体(union Data:联合体的所有成员共享相同的内存空间,其大小为最大成员的大小。这意味着在任何时刻,只能有一个成员是有效的,从而节省了内存。例如,这里的intfloat成员共享相同的内存空间,避免了为每种数据类型单独分配内存。
  2. 结构体(Storage:结构体包含一个枚举类型DataType来标识当前存储的数据类型,以及一个联合体Data来实际存储数据。通过这种方式,我们不仅可以复用内存空间(通过联合体),还可以记录当前存储的数据类型,以便在后续使用中正确解析数据。在printData函数中,通过switch语句根据type字段来决定如何打印data联合体中的数据。这样,结构体和联合体结合使用,既满足了存储不同类型数据的需求,又达到了节省内存空间的目的。