MST

星途 面试题库

面试题:C语言中指针的指针基础应用

请编写一段C语言代码,使用指针的指针来动态分配一个二维数组,并对数组元素进行初始化和打印。要求说明每一步操作的含义。
23.2万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

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

int main() {
    int rows = 3; // 定义二维数组的行数
    int cols = 4; // 定义二维数组的列数

    // 动态分配一个指针数组,这个指针数组中的每个元素都将指向一个一维数组
    int **arr = (int **)malloc(rows * sizeof(int *)); 
    if (arr == NULL) {
        printf("内存分配失败\n");
        return 1;
    }

    // 为每一行分配内存
    for (int i = 0; i < rows; i++) {
        arr[i] = (int *)malloc(cols * sizeof(int)); 
        if (arr[i] == NULL) {
            printf("内存分配失败\n");
            // 释放已经分配的内存
            for (int j = 0; j < i; j++) {
                free(arr[j]);
            }
            free(arr);
            return 1;
        }
    }

    // 初始化二维数组元素
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            arr[i][j] = i * cols + j; // 简单的初始化,值为行号 * 列数 + 列号
        }
    }

    // 打印二维数组
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            printf("%d ", arr[i][j]);
        }
        printf("\n");
    }

    // 释放为每一行分配的内存
    for (int i = 0; i < rows; i++) {
        free(arr[i]);
    }
    // 释放指针数组
    free(arr);

    return 0;
}
  1. 定义行数和列数

    int rows = 3;
    int cols = 4;
    

    这里定义了要创建的二维数组的行数为3,列数为4。

  2. 分配指针数组的内存

    int **arr = (int **)malloc(rows * sizeof(int *)); 
    

    malloc(rows * sizeof(int *)) 分配了一块内存,大小为 rowsint * 类型的空间,也就是可以存放 rows 个指针,这些指针将分别指向每一行的一维数组。然后将分配的内存地址转换为 int ** 类型并赋值给 arr。检查 arr 是否为 NULL,如果是,说明内存分配失败,打印错误信息并退出程序。

  3. 为每一行分配内存

    for (int i = 0; i < rows; i++) {
        arr[i] = (int *)malloc(cols * sizeof(int)); 
        if (arr[i] == NULL) {
            printf("内存分配失败\n");
            for (int j = 0; j < i; j++) {
                free(arr[j]);
            }
            free(arr);
            return 1;
        }
    }
    

    外层循环遍历 rows,对于每一行 imalloc(cols * sizeof(int)) 分配了一块内存,大小为 colsint 类型的空间,也就是每一行的一维数组。同样检查分配是否成功,如果失败,释放已经分配的行内存和指针数组内存,并退出程序。

  4. 初始化二维数组元素

    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            arr[i][j] = i * cols + j; 
        }
    }
    

    嵌套的两层循环遍历整个二维数组,使用 i * cols + j 的方式简单初始化每个元素的值。

  5. 打印二维数组

    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            printf("%d ", arr[i][j]);
        }
        printf("\n");
    }
    

    同样是嵌套的两层循环遍历二维数组,按行打印每个元素的值,每行结束后换行。

  6. 释放内存

    for (int i = 0; i < rows; i++) {
        free(arr[i]);
    }
    free(arr);
    

    首先释放每一行分配的内存,然后释放指针数组分配的内存,避免内存泄漏。