MST

星途 面试题库

面试题:C语言联合体指针在内存管理与优化中的技巧

在一个动态内存分配的场景下,有一个数组,数组元素是包含联合体的结构体。联合体成员分别是不同长度的字符串和整型数据。在程序运行过程中,根据实际需求,通过指针灵活切换使用不同的联合体成员,并对内存进行合理的分配与释放,确保不发生内存泄漏。请编写一个完整的C语言程序来实现上述功能,并阐述你在实现过程中是如何考虑内存优化的。
26.6万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

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

// 定义联合体
union Data {
    char str[20];
    int num;
};

// 定义结构体
struct Element {
    union Data data;
};

// 打印联合体数据
void printData(struct Element *element, int isString) {
    if (isString) {
        printf("String: %s\n", element->data.str);
    } else {
        printf("Integer: %d\n", element->data.num);
    }
}

int main() {
    int n = 5; // 数组元素个数
    struct Element *array = (struct Element *)malloc(n * sizeof(struct Element));
    if (array == NULL) {
        perror("malloc");
        return 1;
    }

    // 使用字符串
    for (int i = 0; i < n; i++) {
        sprintf(array[i].data.str, "String %d", i);
    }
    for (int i = 0; i < n; i++) {
        printData(&array[i], 1);
    }

    // 使用整型
    for (int i = 0; i < n; i++) {
        array[i].data.num = i * 2;
    }
    for (int i = 0; i < n; i++) {
        printData(&array[i], 0);
    }

    free(array);
    return 0;
}

内存优化考虑

  1. 动态内存分配:在程序中使用malloc函数进行动态内存分配,根据实际需要的数组大小分配内存,避免静态数组造成的内存浪费。同时,每次malloc后都检查返回值,确保内存分配成功,防止因分配失败而导致后续使用未初始化指针的错误。
  2. 内存释放:程序结束前使用free函数释放之前分配的内存,避免内存泄漏。这确保了动态分配的内存空间在不再使用时能够被系统回收,供其他程序使用。
  3. 联合体的使用:联合体共享内存空间,根据实际需求灵活切换使用不同类型的成员,避免了为每种数据类型单独分配内存,从数据结构层面优化了内存使用,使得在同一内存位置可以存储不同类型的数据,提高了内存利用率。