MST

星途 面试题库

面试题:C语言指针数组与动态内存管理

设计一个函数,接收一个整数n作为参数,在函数内部动态创建一个指针数组,数组元素个数为n。每个指针指向一个动态分配的长度为10的整型数组。对每个长度为10的整型数组进行初始化,使其元素值为从1到10的递增序列。最后,释放所有动态分配的内存。请写出完整的C语言代码,并阐述这样设计可能出现的内存泄漏风险以及如何避免。
12.9万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

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

void createAndInitArray(int n) {
    int **ptrArray = (int **)malloc(n * sizeof(int *));
    if (ptrArray == NULL) {
        perror("malloc");
        return;
    }

    for (int i = 0; i < n; i++) {
        ptrArray[i] = (int *)malloc(10 * sizeof(int));
        if (ptrArray[i] == NULL) {
            // 如果分配失败,释放之前分配的内存
            for (int j = 0; j < i; j++) {
                free(ptrArray[j]);
            }
            free(ptrArray);
            perror("malloc");
            return;
        }
        for (int k = 0; k < 10; k++) {
            ptrArray[k] = k + 1;
        }
    }

    // 释放内存
    for (int i = 0; i < n; i++) {
        free(ptrArray[i]);
    }
    free(ptrArray);
}

int main() {
    int n = 3;
    createAndInitArray(n);
    return 0;
}

内存泄漏风险及避免方法

  1. 风险
    • 如果在分配ptrArraymalloc失败,函数直接返回,此时不会释放任何内存,但也没有成功创建所需的数据结构,可能导致内存泄漏。
    • 如果在分配ptrArray[i]malloc失败,已经分配的ptrArray[0]ptrArray[i - 1]以及ptrArray本身的内存没有释放,会造成内存泄漏。
  2. 避免方法
    • 在每次malloc调用后检查返回值是否为NULL,若为NULL表示分配失败,及时释放之前已成功分配的内存。如代码中所示,在分配ptrArrayptrArray[i]后都进行了检查,并在分配失败时释放之前分配的内存。