MST
星途 面试题库

面试题:C语言不规则多维数组作为函数参数的处理

在C语言中,假设存在一个不规则的二维数组(即每行元素个数不同),例如 `int *arr[3]; arr[0] = (int *)malloc(2 * sizeof(int)); arr[1] = (int *)malloc(3 * sizeof(int)); arr[2] = (int *)malloc(1 * sizeof(int));`。请编写一个函数 `void processIrregularArray(int *arr[], int size)`,该函数能够正确遍历这个不规则二维数组并对每个元素进行加1操作。阐述在这种情况下,与规则多维数组作为函数参数时相比,函数参数传递和数组访问的规则有哪些变化及需要特别注意的地方。
48.9万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

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

void processIrregularArray(int *arr[], int size) {
    for (int i = 0; i < size; i++) {
        // 这里假设有一个方法获取每行的元素个数,实际需根据具体逻辑来
        int rowSize = i == 0? 2 : (i == 1? 3 : 1); 
        for (int j = 0; j < rowSize; j++) {
            arr[i][j]++;
        }
    }
}

与规则多维数组作为函数参数时的区别

  1. 函数参数传递
    • 规则多维数组:函数参数可直接写数组名,如 void func(int arr[][COL_SIZE], int rowSize),其中 COL_SIZE 是固定的列数。编译器可根据此信息确定数组元素在内存中的布局。
    • 不规则二维数组:函数参数为指向指针的指针 int *arr[]int **arr,因为每行长度不固定,无法像规则数组那样通过固定列数确定内存布局。同时需要额外传递一个参数 size 来表示数组的行数。
  2. 数组访问
    • 规则多维数组:访问元素时可通过 arr[i][j] 直接访问,编译器根据固定的列数和 ij 的值计算元素地址。
    • 不规则二维数组:访问元素同样用 arr[i][j],但由于每行长度不同,在访问前需要明确知道每一行的长度,否则可能导致越界访问。如上述代码中需手动确定每行长度(实际应用中需根据逻辑获取)。

特别注意的地方

  1. 内存管理:由于是通过 malloc 分配内存,使用完后需要在适当位置用 free 释放内存,避免内存泄漏。
  2. 每行长度记录:必须妥善记录或能动态获取每行的长度,以保证访问数组元素时不会越界。