← Back to Index
Research & Engineering Archive

LPC 9. Multi-dimensional Arrays

By Jingnan Huang · March 25, 2025 · 1467 Words

Last Edit: 3/25/25

在之前介绍了 Array 的使用,但那些都是对于 One-Dimensional Arrays 的,但是引入 Multi-Dimension 也非常重要

9.1 Why and How to use 2D Array
#

9.1.1 How to Create
#

9.1.1.1 Declaration Only
#

myArray[0][0] = 1;
myArray[0][1] = 2;
myArray[0][2] = 3;
myArray[1][0] = 4;
myArray[1][1] = 5;
myArray[1][2] = 6;

就能得到以下效果

image.png

#include <stdio.h>
int main(void) {
  int myArray[3][4];
  
  for (int row = 0; row < 3; row++) {
    for (int col = 0; col < 4; col++) {
      myArray[row][col] = row * 4 + col;
      printf("myArray[%d][%d] = %d\n", row, col, myArray[row][col]);
    }
  }
  return 0;
}

9.1.1.2. Declaration and Initialization
#

9.1.2 2D Array’s Memory
#

image.png

9.2. How do we pass a 2D array to a function?
#

void func(int arr2D[][], int rows, int cols){
    arr2D[4][5] = 6; 
    // should go dereference the address:
    // arr2D + row (= 4) * number of columns + col (= 5)
    // the number of columns is unknown!!!
}
void func(int rows, int cols, int arr2D[][cols]){
    arr2D[4][5] = 6; 
    // should go dereference the address:
    // arr2D + row (= 4) * cols + col (= 5)
}

9.3 Dynamic Memory Allocation of 2D Arrays
#

9.3.1. Method 1: Dynamic Allocation of an array of pointers
#

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

image.png

for (int row = 0; row < 3; row++) {
    for (int col = 0; col < 4; col++) {
        *( *(arr + row) + col) = row * 4 + col + 1;
        // 或者
        arr[row][col] = row * 4 + col + 1;
    }
}
for (int row = 0; row < 3; row++) {
  free(*(arr + row));
  // OR
  // free(arr[row]);
  arr[row] = NULL;
}
free(arr);
arr = NULL;

9.3.2. Method 3: Dynamic Allocation of a 1D array
#

#include <stdlib.h>
int main(void) {
    int rows = 3, cols = 4;
    int* arr = (int*)malloc(rows * cols * sizeof(int));  // 为整个二维数组分配一维数组空间

    // 使用一维索引填充数组
    for (int row = 0; row < rows; row++) {
        for (int col = 0; col < cols; col++) {
            *(arr + row * cols + col) = row * cols + col + 1;
        }
    }
    free(arr);  // 释放分配的内存
    return 0;
}