MST
星途 面试题库

面试题:C语言联合体在复杂数据结构中的内存优化

假设你正在开发一个通信协议解析模块,数据包中的某部分根据不同的标志位可能是一个16位整数,也可能是两个8位字符。请使用联合体设计一个数据结构来处理这种情况,并编写函数实现对这部分数据的正确解析和存储,同时说明如何确保内存使用的高效性和数据访问的正确性。
41.2万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试
#include <stdio.h>
#include <string.h>

// 定义联合体
union Data {
    short intValue;
    char charValue[2];
};

// 解析函数
void parseData(union Data *data, int flag, const char *packet) {
    if (flag) {
        // 标志位为真,解析为16位整数
        memcpy(&data->intValue, packet, sizeof(short));
    } else {
        // 标志位为假,解析为两个8位字符
        data->charValue[0] = packet[0];
        data->charValue[1] = packet[1];
    }
}

// 打印函数
void printData(union Data *data, int flag) {
    if (flag) {
        printf("解析为16位整数: %d\n", data->intValue);
    } else {
        printf("解析为两个8位字符: %c %c\n", data->charValue[0], data->charValue[1]);
    }
}

确保内存使用高效性和数据访问正确性的方法:

  1. 内存使用高效性
    • 联合体的设计使得不同数据类型共享同一块内存空间,避免了额外的内存开销。
    • 这里union Data的大小取决于其最大成员,即short类型,大小为2字节,不会因为同时支持两种数据类型而额外增加内存。
  2. 数据访问正确性
    • 使用标志位flag来明确当前联合体中的数据是何种类型,避免错误的访问。
    • parseData函数中,根据标志位选择正确的解析方式,保证数据被正确存储到联合体中。
    • printData函数中,同样根据标志位选择正确的打印方式,确保数据的正确展示。