首页 > 解决方案 > 在 C 中动态分配 3D 矩阵

问题描述

所以我有一个像这样创建的二维数组:

int** init_grid(int cell_grid_size) {
    // matrix variables
    int *memory_grid;
    int **matrix;
    int i;
    int j;

    // memory for matrix
    memory_grid = malloc(cell_grid_size * cell_grid_size * sizeof(int));
    matrix = malloc(cell_grid_size * sizeof(int *));

    // fill matrix with rows
    for(i = 0; i < cell_grid_size; i++) {
        matrix[i] = &memory_grid[i*cell_grid_size];
    }

    // return fresh matrix
    return matrix;
}

如您所见,它正在初始化一个整数矩阵。但是,我想初始化一个大小为 2 的整数数组矩阵(即 3D 矩阵),但我似乎不太了解如何添加下一个维度。

任何帮助将不胜感激。

标签: c

解决方案


用于int ***指向类型为 的指针数组int **。每个指向一个int *. 每个int *指向一个数组的指针int

为简洁起见,分配检查NULL省略。

int*** init_grid(size_t xsize, size_t ysize, size_t zsize) {
  int ***matrix = malloc(sizeof matrix[0] * xsize);

  for (x = 0; x < xsize; x++) {
    matrix[x] = malloc(sizeof matrix[x][0] * ysize);
    for (y = 0; y < ysize; y++) {
      matrix[x][y] = malloc(sizeof matrix[x][y][0] * zsize);
      // or to zero-out the `int` data
      matrix[x][y] = calloc(zsize, sizeof matrix[x][y][0]);
    }
  }
  return matrix;
}

用于size_t数组索引和大小调整。

免费:

void free_grid(int ***matrix, size_t xsize, size_t ysize) {
  if (matrix) {
    for (x = 0; x < xsize; x++) {
      if (matrix[x]) {
        for (y = 0; y < ysize; y++) {
          free(matrix[x][y])
        }
      }
      free(matrix[x]);
    }
    free(matrix);
  }
}

推荐阅读