MST

星途 面试题库

面试题:C语言多维数组指针与动态内存分配的深度结合

使用动态内存分配创建一个 `m` 行 `n` 列的二维数组,通过指针操作来实现对数组元素的读写。要求编写一个函数 `int** create2DArray(int m, int n)` 用于创建数组并返回指向该二维数组的指针,以及一个函数 `void free2DArray(int** arr, int m)` 用于释放分配的内存。分析在此过程中指针的内存布局以及如何避免内存泄漏。最后编写主函数调用这两个函数并进行简单的读写操作。
21.3万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试
#include <iostream>

// 创建二维数组的函数
int** create2DArray(int m, int n) {
    int** arr = new int* [m];
    for (int i = 0; i < m; ++i) {
        arr[i] = new int[n];
    }
    return arr;
}

// 释放二维数组内存的函数
void free2DArray(int** arr, int m) {
    for (int i = 0; i < m; ++i) {
        delete[] arr[i];
    }
    delete[] arr;
}

int main() {
    int m = 3;
    int n = 4;
    int** array = create2DArray(m, n);

    // 写入操作
    for (int i = 0; i < m; ++i) {
        for (int j = 0; j < n; ++j) {
            array[i][j] = i * n + j;
        }
    }

    // 读取操作
    for (int i = 0; i < m; ++i) {
        for (int j = 0; j < n; ++j) {
            std::cout << array[i][j] << " ";
        }
        std::cout << std::endl;
    }

    free2DArray(array, m);
    return 0;
}

指针的内存布局分析

  1. int** arr = new int* [m];:这一步在堆上分配了一个包含 mint* 类型元素的数组,即 m 个指针,这些指针将分别指向 m 行的数组。
  2. for (int i = 0; i < m; ++i) { arr[i] = new int[n]; }:在上述步骤分配的 m 个指针中,每个指针又分别在堆上分配了一个包含 nint 类型元素的数组,从而构成了一个 mn 列的二维数组。

避免内存泄漏的方法

  1. 释放行指针指向的内存:在 free2DArray 函数中,通过 for (int i = 0; i < m; ++i) { delete[] arr[i]; } 释放每一行分配的内存,因为每一行都是通过 new int[n] 分配的动态数组,所以使用 delete[] 来释放。
  2. 释放指向行指针的数组内存:使用 delete[] arr; 释放最开始分配的包含 mint* 类型元素的数组,因为它是通过 new int* [m] 分配的,所以同样使用 delete[] 来释放。

这样就确保了在使用完动态分配的二维数组后,所有分配的内存都被正确释放,避免了内存泄漏。