MST
星途 面试题库

面试题:C语言中多维数组指针在矩阵运算中的应用

假设有一个二维矩阵,其元素为整数。请使用C语言的多维数组指针,编写一个函数,实现两个同阶矩阵的相加,并返回结果矩阵。函数原型为:int** addMatrices(int** matrix1, int** matrix2, int rows, int cols)。请考虑内存分配与释放,确保代码的正确性与健壮性。
22.6万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

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

int** addMatrices(int** matrix1, int** matrix2, int rows, int cols) {
    // 分配结果矩阵的内存
    int** result = (int**)malloc(rows * sizeof(int*));
    if (result == NULL) {
        fprintf(stderr, "内存分配失败\n");
        return NULL;
    }
    for (int i = 0; i < rows; i++) {
        result[i] = (int*)malloc(cols * sizeof(int));
        if (result[i] == NULL) {
            // 如果某一行分配失败,释放之前已分配的行
            for (int j = 0; j < i; j++) {
                free(result[j]);
            }
            free(result);
            fprintf(stderr, "内存分配失败\n");
            return NULL;
        }
    }

    // 矩阵相加
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            result[i][j] = matrix1[i][j] + matrix2[i][j];
        }
    }

    return result;
}

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

你可以使用以下方式调用这个函数:

int main() {
    int rows = 3;
    int cols = 3;

    // 分配matrix1的内存
    int** matrix1 = (int**)malloc(rows * sizeof(int*));
    for (int i = 0; i < rows; i++) {
        matrix1[i] = (int*)malloc(cols * sizeof(int));
    }
    // 初始化matrix1
    matrix1[0][0] = 1; matrix1[0][1] = 2; matrix1[0][2] = 3;
    matrix1[1][0] = 4; matrix1[1][1] = 5; matrix1[1][2] = 6;
    matrix1[2][0] = 7; matrix1[2][1] = 8; matrix1[2][2] = 9;

    // 分配matrix2的内存
    int** matrix2 = (int**)malloc(rows * sizeof(int*));
    for (int i = 0; i < rows; i++) {
        matrix2[i] = (int*)malloc(cols * sizeof(int));
    }
    // 初始化matrix2
    matrix2[0][0] = 1; matrix2[0][1] = 2; matrix2[0][2] = 3;
    matrix2[1][0] = 4; matrix2[1][1] = 5; matrix2[1][2] = 6;
    matrix2[2][0] = 7; matrix2[2][1] = 8; matrix2[2][2] = 9;

    int** result = addMatrices(matrix1, matrix2, rows, cols);
    if (result != NULL) {
        // 输出结果矩阵
        for (int i = 0; i < rows; i++) {
            for (int j = 0; j < cols; j++) {
                printf("%d ", result[i][j]);
            }
            printf("\n");
        }
        freeMatrix(result, rows);
    }

    freeMatrix(matrix1, rows);
    freeMatrix(matrix2, rows);

    return 0;
}

在上述代码中:

  1. addMatrices 函数实现了矩阵相加的功能。首先为结果矩阵分配内存,如果内存分配失败,函数会进行相应的错误处理并返回 NULL。然后通过双重循环逐元素相加两个矩阵,最后返回结果矩阵。
  2. freeMatrix 函数用于释放矩阵占用的内存,避免内存泄漏。
  3. main 函数中,初始化两个矩阵,调用 addMatrices 函数进行矩阵相加,并输出结果矩阵,最后释放所有分配的内存。