MST

星途 面试题库

面试题:C语言数组定义的专家难度问题

在C语言中,如何实现一个动态二维数组,其行数和列数都由用户在运行时输入决定。要求不仅能正确分配内存,还要编写函数实现对该动态二维数组的元素赋值、取值操作,并且在使用完毕后能正确释放内存以避免内存泄漏。阐述这种动态二维数组与普通二维数组在内存管理上的主要区别。
12.1万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试

1. 实现动态二维数组的内存分配

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

// 分配动态二维数组内存
int** createDynamic2DArray(int rows, int cols) {
    int** arr = (int**)malloc(rows * sizeof(int*));
    if (arr == NULL) {
        perror("malloc");
        return NULL;
    }
    for (int i = 0; i < rows; i++) {
        arr[i] = (int*)malloc(cols * sizeof(int));
        if (arr[i] == NULL) {
            for (int j = 0; j < i; j++) {
                free(arr[j]);
            }
            free(arr);
            perror("malloc");
            return NULL;
        }
    }
    return arr;
}

2. 实现元素赋值操作

// 对动态二维数组元素赋值
void setValue(int** arr, int row, int col, int value) {
    arr[row][col] = value;
}

3. 实现元素取值操作

// 获取动态二维数组元素值
int getValue(int** arr, int row, int col) {
    return arr[row][col];
}

4. 释放动态二维数组内存

// 释放动态二维数组内存
void freeDynamic2DArray(int** arr, int rows) {
    for (int i = 0; i < rows; i++) {
        free(arr[i]);
    }
    free(arr);
}

5. 动态二维数组与普通二维数组在内存管理上的主要区别

  • 普通二维数组:内存是在编译时分配的,大小固定,一旦定义好,其行数和列数在程序运行期间不能改变。例如 int arr[3][4];,其内存是连续分配的,占用一块固定大小的内存空间,生命周期与所在的作用域相关,作用域结束时自动释放内存,无需手动管理。
  • 动态二维数组:内存是在运行时通过 malloc 等函数分配的,其行数和列数可以由用户在运行时输入决定。由于是手动分配内存,使用完毕后必须手动调用 free 函数释放内存,否则会造成内存泄漏。动态二维数组内存分配不连续,第一维是一个指针数组,每个指针指向第二维的数组内存空间。

示例主函数

int main() {
    int rows, cols;
    printf("请输入行数: ");
    scanf("%d", &rows);
    printf("请输入列数: ");
    scanf("%d", &cols);

    int** dynamicArray = createDynamic2DArray(rows, cols);
    if (dynamicArray == NULL) {
        return 1;
    }

    // 赋值操作示例
    setValue(dynamicArray, 0, 0, 10);
    setValue(dynamicArray, 1, 2, 20);

    // 取值操作示例
    printf("(0, 0)位置的值: %d\n", getValue(dynamicArray, 0, 0));
    printf("(1, 2)位置的值: %d\n", getValue(dynamicArray, 1, 2));

    freeDynamic2DArray(dynamicArray, rows);
    return 0;
}