MST

星途 面试题库

面试题:C语言复杂结构体嵌套下的内存释放时机

假设有如下结构体定义: ```c struct SubStruct { int *data; struct SubStruct *next; }; struct MainStruct { struct SubStruct *subHead; char *name; }; ``` 在动态分配了`MainStruct`结构体实例后,写出正确释放所有动态分配内存的代码,并详细说明每一步释放操作的时机和必要性。
25.0万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

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

// 释放SubStruct链表内存的函数
void freeSubStruct(struct SubStruct *subHead) {
    struct SubStruct *current = subHead;
    struct SubStruct *next;
    while (current != NULL) {
        // 释放data指向的内存
        if (current->data != NULL) {
            free(current->data);
        }
        next = current->next;
        // 释放当前SubStruct节点内存
        free(current);
        current = next;
    }
}

// 释放MainStruct内存的函数
void freeMainStruct(struct MainStruct *mainStruct) {
    if (mainStruct != NULL) {
        // 释放subHead指向的SubStruct链表内存
        if (mainStruct->subHead != NULL) {
            freeSubStruct(mainStruct->subHead);
        }
        // 释放name指向的内存
        if (mainStruct->name != NULL) {
            free(mainStruct->name);
        }
        // 释放MainStruct结构体实例内存
        free(mainStruct);
    }
}

int main() {
    // 这里只是模拟动态分配MainStruct结构体实例
    struct MainStruct *mainStruct = (struct MainStruct *)malloc(sizeof(struct MainStruct));
    mainStruct->subHead = (struct SubStruct *)malloc(sizeof(struct SubStruct));
    mainStruct->subHead->data = (int *)malloc(sizeof(int));
    mainStruct->name = (char *)malloc(10 * sizeof(char));

    // 释放内存
    freeMainStruct(mainStruct);

    return 0;
}
  1. freeSubStruct函数
    • 时机:在释放MainStruct实例中的subHead指向的链表时调用。
    • 必要性SubStruct链表中的每个节点都动态分配了内存,包括data指针指向的内存。通过遍历链表,先释放每个节点data指向的内存,再释放节点自身的内存,防止内存泄漏。
  2. freeMainStruct函数
    • 释放subHead指向的链表
      • 时机:在释放MainStruct实例之前。
      • 必要性subHead指向的链表是动态分配的,如果不先释放链表,会导致链表占用的内存无法回收。
    • 释放name指向的内存
      • 时机:在释放MainStruct实例之前且在释放subHead指向的链表之后。
      • 必要性name指针动态分配了内存,若不释放会导致内存泄漏。
    • 释放MainStruct实例
      • 时机:在释放完subHead链表和name指向的内存之后。
      • 必要性MainStruct实例本身也是动态分配的,若不释放会导致内存泄漏。