简体   繁体   English

在 C 中动态分配一个 3D 矩阵

[英]Dynamically allocating a 3D matrix in C

So I've got a 2D Array which I am creating like this:所以我有一个像这样创建的二维数组:

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;
}

As you can see it's initialising a matrix of integers.如您所见,它正在初始化一个整数矩阵。 However, I'd like to to initialize a matrix of integer arrays of size 2 (ie a 3D Matrix) but I can't quite seem to get my head around how to add the next dimension.但是,我想初始化一个大小为 2 的 integer arrays 矩阵(即 3D 矩阵),但我似乎不太明白如何添加下一个维度。

Any help would be greatly appreciated.任何帮助将不胜感激。

For an int *** pointing to an array of pointers of type int ** .对于指向int ** int *** Each pointing to an int * .每个指向一个int * Each int * pointer to an array of int .每个int *指向一个int数组的指针。

Allocation checks for NULL omitted for brevity.为简洁起见,省略了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;
}

Use size_t for array indexing and sizing.使用size_t进行数组索引和大小调整。

To free:免费:

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);
  }
}
void grid_init(int* matrix, unsigned int xsize, unsigned int ysize, unsigned int unsigned int zsize)
{
    unsigned int matrix_size;

    // flatten matrix size in Byte
    matrix_size = xsize*ysize*zsize*sizeof(int);

    matrix = (int*)malloc(matrix_size);
    memset(matrix, 0, sizeof(matrix_size);
}

Once matrix is built, you can loop through it using that loop:构建矩阵后,您可以使用该循环遍历它:

void grid_fill(int* matrix, int value, unsigned int xsize, unsigned int ysize, unsigned int zsize)
{
 int i,j,k;

 for(k=0; k<zsize; k++)
 {
     for(i=0; i<ysize; i++)
     {
         for(j=0; j<xsize; j++)
         {
              matrix[j+i*xsize+k*ysize*xsize] = value;
         }
     }
  }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM