我希望能够使用一个结构体,其中成员是二维数组,并且该结构体存储在堆上。
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
函数。
感谢您的帮助。
对于 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] = ...;