MST

星途 面试题库

面试题:C语言多维数组下标的内存关联与应用

假设有一个不规则的二维数组(即每行元素个数不同),通过指针数组的方式定义为 int *arr[3]; 其中 arr[0] 指向一个包含2个元素的数组,arr[1] 指向一个包含3个元素的数组,arr[2] 指向一个包含1个元素的数组。请编写代码实现对这个不规则二维数组的内存分配、初始化(每个元素初始化为其所在行下标与列下标的乘积),并在最后释放所有分配的内存。详细说明在这个过程中,多维数组下标的概念是如何与内存操作紧密联系的。
26.3万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

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

int main() {
    int *arr[3];

    // 内存分配
    arr[0] = (int *)malloc(2 * sizeof(int));
    arr[1] = (int *)malloc(3 * sizeof(int));
    arr[2] = (int *)malloc(1 * sizeof(int));

    // 初始化
    for (int i = 0; i < 3; i++) {
        if (i == 0) {
            for (int j = 0; j < 2; j++) {
                arr[i][j] = i * j;
            }
        } else if (i == 1) {
            for (int j = 0; j < 3; j++) {
                arr[i][j] = i * j;
            }
        } else {
            for (int j = 0; j < 1; j++) {
                arr[i][j] = i * j;
            }
        }
    }

    // 输出验证
    for (int i = 0; i < 3; i++) {
        if (i == 0) {
            for (int j = 0; j < 2; j++) {
                printf("%d ", arr[i][j]);
            }
        } else if (i == 1) {
            for (int j = 0; j < 3; j++) {
                printf("%d ", arr[i][j]);
            }
        } else {
            for (int j = 0; j < 1; j++) {
                printf("%d ", arr[i][j]);
            }
        }
        printf("\n");
    }

    // 释放内存
    free(arr[0]);
    free(arr[1]);
    free(arr[2]);

    return 0;
}

多维数组下标的概念与内存操作的联系

  1. 内存分配:通过 malloc 为每一行分配不同大小的内存空间,这是基于每行元素个数不同的特点。例如 arr[0] = (int *)malloc(2 * sizeof(int)); 为第一行分配了能容纳2个 int 类型元素的空间。这里的行下标 0 对应着要分配内存的具体指针 arr[0]
  2. 初始化:使用双重循环来访问每个元素。外层循环控制行下标 i,内层循环根据不同行的元素个数控制列下标 j。如 arr[i][j] = i * j; 通过行下标 i 和列下标 j 计算出要初始化的值,并赋值给对应的内存位置。这里的 arr[i][j] 本质上是通过指针运算找到对应内存位置进行赋值,arr[i] 是指向第 i 行首元素的指针,arr[i][j] 相当于 *(arr[i] + j),即从第 i 行首元素开始偏移 jint 大小的位置。
  3. 释放内存:根据之前分配内存时与行下标的对应关系,通过 free(arr[0]); 等语句释放每一行的内存,确保没有内存泄漏。行下标 012 分别对应要释放的不同行的内存指针。