MST

星途 面试题库

面试题:C语言中malloc()和free()在复杂数据结构中的应用

假设有一个复杂的数据结构,比如多层嵌套的链表(链表节点中又包含链表),请描述如何使用malloc()为其分配内存,以及使用free()正确释放内存,需要考虑内存释放的顺序以避免内存泄漏。
12.9万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试
  1. 使用malloc()分配内存
    • 对于多层嵌套的链表,先为最外层链表的头节点分配内存,使用malloc(sizeof(外层链表节点结构体))。假设外层链表节点结构体定义如下:
    typedef struct OuterNode {
        int data;
        struct InnerNode *innerList;
        struct OuterNode *next;
    } OuterNode;
    
    为外层链表头节点分配内存:
    OuterNode *outerHead = (OuterNode *)malloc(sizeof(OuterNode));
    if (outerHead == NULL) {
        // 处理内存分配失败情况,如返回错误或退出程序
        return;
    }
    
    • 然后,对于外层链表每个节点中的内层链表,同样需要分配内存。假设内层链表节点结构体定义如下:
    typedef struct InnerNode {
        int innerData;
        struct InnerNode *next;
    } InnerNode;
    
    为内层链表节点分配内存:
    InnerNode *innerNode = (InnerNode *)malloc(sizeof(InnerNode));
    if (innerNode == NULL) {
        // 处理内存分配失败情况
        return;
    }
    
    在内层链表分配过程中,可能需要循环分配多个节点,直到内层链表构建完成。同样,在外层链表中,也需要循环分配多个外层节点,构建完整的多层嵌套链表结构。
  2. 使用free()释放内存
    • 释放内存的顺序很关键,要遵循从内到外的顺序。首先释放内层链表的内存。对于内层链表,从链表头开始,依次释放每个节点:
    InnerNode *currentInner = outerHead->innerList;
    InnerNode *nextInner;
    while (currentInner!= NULL) {
        nextInner = currentInner->next;
        free(currentInner);
        currentInner = nextInner;
    }
    
    • 内层链表释放完后,再释放外层链表节点的内存。从外层链表头开始,依次释放每个节点:
    OuterNode *currentOuter = outerHead;
    OuterNode *nextOuter;
    while (currentOuter!= NULL) {
        nextOuter = currentOuter->next;
        free(currentOuter);
        currentOuter = nextOuter;
    }
    
    这样就能确保内存正确释放,避免内存泄漏。

注意,在实际代码中,还需要根据具体的数据结构细节和业务逻辑对上述代码进行适当调整和完善。并且,在C++中,更推荐使用newdelete操作符来进行内存管理。