MST
星途 面试题库

面试题:C语言结构体动态内存分配错误处理在复杂场景下的应用

假设有一个链表结构,链表节点是一个结构体,该结构体除了指向下一个节点的指针外,还包含一个动态分配内存的数组(数组大小根据用户输入决定)。编写一个函数用于向链表中插入新节点,要求在动态分配数组内存、分配新节点内存以及处理链表连接等任何步骤出现错误时,都能正确地处理错误,释放所有已分配的内存,并返回合适的错误码。详细描述你的设计思路,并给出完整代码。
50.1万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试

设计思路

  1. 内存分配
    • 首先为新节点分配内存。如果分配失败,直接返回错误码,因为后续操作依赖于节点的存在。
    • 接着根据用户输入为节点中的动态数组分配内存。若数组内存分配失败,释放已分配的节点内存,然后返回错误码。
  2. 链表连接
    • 找到链表的合适位置(这里假设在链表头部插入),将新节点连接到链表中。
  3. 错误处理
    • 在任何内存分配步骤失败时,释放之前已分配的内存,确保没有内存泄漏,并返回相应错误码。

代码

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

// 定义链表节点结构体
typedef struct Node {
    int *data; // 动态分配的数组
    struct Node *next;
} Node;

// 插入新节点函数
int insertNode(Node **head, int size, int *values) {
    // 分配新节点内存
    Node *newNode = (Node *)malloc(sizeof(Node));
    if (newNode == NULL) {
        return -1; // 节点内存分配失败
    }

    // 分配动态数组内存
    newNode->data = (int *)malloc(size * sizeof(int));
    if (newNode->data == NULL) {
        free(newNode);
        return -2; // 数组内存分配失败
    }

    // 复制数据到动态数组
    for (int i = 0; i < size; i++) {
        newNode->data[i] = values[i];
    }

    // 连接新节点到链表头部
    newNode->next = *head;
    *head = newNode;

    return 0; // 成功
}

// 释放链表内存函数
void freeList(Node *head) {
    Node *current = head;
    Node *next;
    while (current != NULL) {
        next = current->next;
        free(current->data);
        free(current);
        current = next;
    }
}

// 测试代码
int main() {
    Node *head = NULL;
    int size = 3;
    int values[] = {1, 2, 3};
    int result = insertNode(&head, size, values);
    if (result == 0) {
        printf("Node inserted successfully.\n");
    } else {
        printf("Insertion failed with error code: %d\n", result);
    }
    freeList(head);
    return 0;
}

以上代码用C语言实现,insertNode函数实现了向链表插入新节点的功能,并且在内存分配失败时进行了恰当的错误处理和内存释放。freeList函数用于释放整个链表的内存。main函数用于测试插入节点的功能。