结构中的多维数组未知大小的内存分配

问题描述 投票:0回答:1

我希望能够使用一个结构体,其中成员是二维数组,并且该结构体存储在堆上。

typedef struct Map
{
    int xSize;
    int ySize;
    int mapMatrix[][];
} Map;

我的 IDE(VS Code,带有 C/C++ MS 扩展)说我可能没有包含该类型元素的数组。我不知道数组维度的大小(不固定为特定大小),所以我不能像这样绕过它。

我想过改用:

typedef struct Map
{
    int xSize;
    int ySize;
    int *mapMatrix[]; // or potentially 'int **mapMatrix;'?
} Map;

但我不确定如何为该数组分配内存(指针的开销是否会比典型的二维数组更多?) 我还想将内存初始化为 0,所以我将使用

calloc
函数。

感谢您的帮助。

c multidimensional-array struct calloc
1个回答
0
投票

对于 2D 灵活数组成员没有优雅的解决方案。处理此问题的常见解决方法是使用一维数组,但通过索引算术访问它,或者在访问之前将其转换为指向二维的指针:

typedef struct
{
    int xSize;
    int ySize;
    int matrix[];
} Map;

Map* map = calloc(1, sizeof *map + sizeof(int[x][y]));
...

map->matrix[i*x + j] = ... ;

//or alternatively:
int (*arr)[map->ySize] = (void*)map->matrix;
arr[i][j] = ...;
© www.soinside.com 2019 - 2024. All rights reserved.