我在尝试访问程序中的 true 2D数组时遇到了一些问题。 我有一个1D数组模拟2D数组来保存一些级别信息(基于区块的游戏)。当我访问某个磁贴时,我执行常见操作以将行/列索引更改为liniar数组:
地图是在堆中分配的,我在关卡结构中保存了一个指向此数组的指针
size = x * y;
level->map = malloc(size * sizeof(struct _mkTile));
[...]
for (size_t i = 0; i < level->y; i++) {
for (size_t e = 0; e < level->x; e++) {
level->map[i * level->y + e].pos.x = xpos;
[...]
我在代码中多次执行此操作,但最近我想使用 true 2D数组来使代码更具可读性。我有很多代码依赖于这个1D数组,所以我也希望将这个访问表单保存到地图中。
阅读本网站,我发现了如何分配2D数组:
struct _mkTile(*map)[x] = malloc(sizeof(struct _mkTile[x][y]));
我将指针保存在我的struct(level-&gt; map)中是相同的,因为很多代码都期望一维数组,所以我执行以下转换level->map = (struct _mkTile *)map;
到目前为止,非常好。旧代码没有问题。
此时我可以使用map[i][e]
指针通过2D索引访问我的图块,但不是level->map
:
所以问题是,如何正确声明指向2D数组(具有未知大小)的指针,允许使用2D访问器[][]
?是否可以将level->map
指针强制转换为 true 2D数组?
答案 0 :(得分:1)
是的,您可以将指针强制转换为1D数组并获取指向2D数组的指针。以与分配2D阵列时相同的类型开始:
struct _mkTile(*map2d)[x] = level->map; // type mismatch, see compiler error
添加演员:
struct _mkTile(*map2d)[x] = (struct _mkTile(*)[x])level->map;
最后,使用typedef清理它:
typedef struct _mkTile row_t[x];
row_t* map2d = (row_t*)level->map;
答案 1 :(得分:0)
在for
循环中,您在level-&gt;地图中指定值,索引看起来不对。尝试:
level->map[i * level->x + e].pos.x = xpos;
它是i * level->x + e
,因为每行i
都有level-&gt; x数据,而不是level-&gt; y。