我正在用C语言编写一个扫雷程序。
我有一个全局变量:
typedef struct box_t
{
int box_type;
int num_mines_bordering;
int is_flagged;
} box_t;
// my global
box_t * gameboard = NULL;
稍后在应用程序中,它会根据行数和列数在堆中进行分配:
gameboard = (box_t *)malloc((rows * cols) * sizeof(box_t));
一切都很好,但是,我索引它的方式现在似乎是不正确的和容易出错的。我不能简单地做gameboard[x][y]
,因为我得到了编译器错误,我现在似乎是不正确的:
#define GET_LOC(ROW, COL) gameboard[(ROW * sizeof(box_t)) + (COL * sizeof(box_t)) * sizeof(box_t)]
// if you call this it would look like: box_t * loc = &GET_LOC(somerow, somecol);
有没有更好的索引方法?
2条答案
按热度按时间3mpgtkmj1#
编译器知道类型,因此知道每个数组条目的大小,因此唯一特殊的是列数
cols
:tpxzln5u2#
您可以使用可变修改类型(VMT)(即指向VLA的指针)。问题是该 type 不能在文件范围内定义。最简单的解决方案是使用
void*
作为全局变量,使用VMT作为本地的、类型正确的视图。或者,可以通过以下方式进行分配和方便的初始化:
使用简单的
free(gamebard_glob)
释放内存。请注意,这种类型的VLA不会在堆栈上分配任何内存。所有内存都是从堆中分配的,使用
malloc
/calloc
。此外,行数可以使用realloc
更改。此解决方案需要任何符合C99的编译器,包括几乎所有主流编译器,除了声名狼借的MSVC。