MST
星途 面试题库

面试题:C语言结构体与联合体在内存管理上的协同应用

假设有一个结构体,其中包含一个联合体成员,联合体中有不同类型的成员(如浮点数、整数数组等)。要求编写一个函数,根据传入的参数来动态分配内存给结构体,并合理初始化联合体成员。同时要考虑内存释放,防止内存泄漏,编写相应的释放函数。请描述整体思路并给出核心代码。
14.7万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试

整体思路

  1. 定义结构体和联合体:定义包含联合体的结构体,联合体中定义不同类型成员。
  2. 动态分配内存函数:在函数中根据传入参数动态分配结构体内存,根据参数类型初始化联合体不同成员。
  3. 内存释放函数:编写函数释放动态分配的结构体内存,注意如果联合体中有动态分配的数组,也要释放其内存。

核心代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// 定义联合体
union Data {
    float f;
    int arr[5];
};

// 定义结构体
struct MyStruct {
    union Data data;
    int type; // 用于标记联合体中使用的成员类型,0代表float,1代表int数组
};

// 动态分配内存并初始化函数
struct MyStruct* createMyStruct(int type) {
    struct MyStruct* newStruct = (struct MyStruct*)malloc(sizeof(struct MyStruct));
    if (newStruct == NULL) {
        return NULL;
    }
    newStruct->type = type;
    if (type == 0) {
        newStruct->data.f = 3.14f;
    } else if (type == 1) {
        for (int i = 0; i < 5; i++) {
            newStruct->data.arr[i] = i;
        }
    }
    return newStruct;
}

// 释放内存函数
void freeMyStruct(struct MyStruct* structPtr) {
    if (structPtr != NULL) {
        free(structPtr);
    }
}

你可以使用以下方式调用这些函数:

int main() {
    struct MyStruct* myStruct1 = createMyStruct(0);
    struct MyStruct* myStruct2 = createMyStruct(1);

    if (myStruct1 != NULL) {
        if (myStruct1->type == 0) {
            printf("Float value: %f\n", myStruct1->data.f);
        } else if (myStruct1->type == 1) {
            printf("Int array values: ");
            for (int i = 0; i < 5; i++) {
                printf("%d ", myStruct1->data.arr[i]);
            }
            printf("\n");
        }
        freeMyStruct(myStruct1);
    }

    if (myStruct2 != NULL) {
        if (myStruct2->type == 0) {
            printf("Float value: %f\n", myStruct2->data.f);
        } else if (myStruct2->type == 1) {
            printf("Int array values: ");
            for (int i = 0; i < 5; i++) {
                printf("%d ", myStruct2->data.arr[i]);
            }
            printf("\n");
        }
        freeMyStruct(myStruct2);
    }

    return 0;
}