MST

星途 面试题库

面试题:C语言指针表达式与内存管理及函数指针的综合运用

编写一个函数 `int ** createMatrix(int rows, int cols)`,该函数使用动态内存分配创建一个二维数组(通过指针模拟)。要求使用指针表达式正确分配和初始化内存,同时返回指向该二维数组的指针。另外,编写一个函数 `void freeMatrix(int ** matrix, int rows)`,使用指针表达式正确释放该二维数组占用的内存。此外,定义一个函数指针类型,该类型的函数接受一个 `int **` 类型的参数(代表上述二维数组),并在函数指针指向的函数中,使用指针表达式计算该二维数组所有元素的和。最后在 `main` 函数中调用这些函数完成相应功能。请详细解释代码中涉及的指针表达式的含义和作用。
36.9万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

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

// 创建二维数组的函数
int ** createMatrix(int rows, int cols) {
    // 分配存放行指针的内存
    int **matrix = (int **)malloc(rows * sizeof(int *));
    if (matrix == NULL) {
        return NULL;
    }
    for (int i = 0; i < rows; i++) {
        // 为每一行分配内存
        matrix[i] = (int *)malloc(cols * sizeof(int));
        if (matrix[i] == NULL) {
            // 如果某一行分配失败,释放之前分配的行指针内存
            for (int j = 0; j < i; j++) {
                free(matrix[j]);
            }
            free(matrix);
            return NULL;
        }
        // 初始化每一行的元素为0
        for (int j = 0; j < cols; j++) {
            matrix[i][j] = 0;
        }
    }
    return matrix;
}

// 释放二维数组内存的函数
void freeMatrix(int ** matrix, int rows) {
    for (int i = 0; i < rows; i++) {
        free(matrix[i]);
    }
    free(matrix);
}

// 定义函数指针类型
typedef int (*SumFunction)(int **);

// 计算二维数组所有元素和的函数
int sumMatrix(int ** matrix, int rows, int cols) {
    int sum = 0;
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            sum += matrix[i][j];
        }
    }
    return sum;
}

int main() {
    int rows = 3;
    int cols = 3;
    int **matrix = createMatrix(rows, cols);
    if (matrix == NULL) {
        printf("Memory allocation failed\n");
        return 1;
    }

    // 赋值一些测试数据
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            matrix[i][j] = i + j;
        }
    }

    // 使用函数指针调用计算和的函数
    SumFunction sumFunc = sumMatrix;
    int totalSum = sumFunc(matrix, rows, cols);
    printf("The sum of matrix elements is: %d\n", totalSum);

    freeMatrix(matrix, rows);
    return 0;
}

指针表达式含义和作用解释

  1. int **matrix = (int **)malloc(rows * sizeof(int *));
    • int ** 表示 matrix 是一个指向指针的指针,用于模拟二维数组。
    • malloc(rows * sizeof(int *)) 分配 rowsint * 类型大小的内存空间,即分配存放 rows 个行指针的内存。返回值是一个 void * 类型指针,需要强制转换为 int ** 类型。这一步创建了二维数组的“骨架”,即每一行的指针。
  2. matrix[i] = (int *)malloc(cols * sizeof(int));
    • 对于每一个 matrix[i](即每一行的指针),malloc(cols * sizeof(int)) 分配 colsint 类型大小的内存空间,也就是为每一行分配存放具体元素的内存。同样,返回值需要强制转换为 int * 类型。
  3. matrix[i][j]
    • 这是访问二维数组元素的常见方式,本质上 matrix[i] 是指向第 i 行的指针,matrix[i][j] 等价于 *(matrix[i] + j),通过指针偏移 jint 类型大小的位置,访问到第 i 行第 j 列的元素。
  4. free(matrix[i]);
    • 释放每一行分配的内存。matrix[i] 是指向第 i 行内存的指针,调用 free 释放这部分内存。
  5. free(matrix);
    • 释放存放行指针的内存。matrix 是指向存放行指针的内存块的指针,调用 free 释放这部分内存,完成整个二维数组内存的释放。
  6. SumFunction sumFunc = sumMatrix;
    • SumFunction 是定义的函数指针类型,sumFunc 是该类型的变量,将 sumMatrix 函数的地址赋值给 sumFunc,这样 sumFunc 就可以像函数名一样调用 sumMatrix 函数。
  7. int totalSum = sumFunc(matrix, rows, cols);
    • 通过函数指针 sumFunc 调用 sumMatrix 函数,计算二维数组所有元素的和,并将结果赋给 totalSum