gpt4 book ai didi

无法在结构中声明二维动态数组

转载 作者:太空宇宙 更新时间:2023-11-04 06:54:01 26 4
gpt4 key购买 nike

所以我有 2 个问题。

我正在尝试学习如何为二维数组动态分配内存。这是一个工作代码,我首先想知道它是否正常,它是否有效,但我真的不知道我是否有内存泄漏或一些我看不到的错误。

typedef struct Map Map;

struct Map
{
int width, height;
int** cases; // Not technically a 2D array but I use it like it in my code
};

int getMapValue(Map map, int x, int y);
void setMapValue(Map* map, int value, int x, int y);

void mallocMap(Map* map, int width, int height);
void freeMap(Map* map);

int main()
{
int l,h,i,j;
Map map;

printf("Width : ");
scanf("%d", &l);
printf("Height : ");
scanf("%d", &h);

map.width = l;
map.height = h;

mallocMap(&map, l, h); // allocate memory for the map

for(j = 0; j < map.height; j++)
for(i = 0; i < map.width; i++)
setMapValue(&map, i*j, i, j); // set some values

for(j = 0; j < map.height; j++)
for(i = 0; i < map.width; i++)
printf("%d ", getMapValue(map, j, i)); // read some values, works fine

freeMap(&map); // free memory

return 0;
}

void mallocMap(Map* map, int width, int height)
{
map->cases = malloc(sizeof(int) * width * height);

if (map->cases == NULL)
{
printf("Error\n");
exit(0);
}
}

void freeMap(Map* map)
{
free(map->cases);
}

int getMapValue(Map map, int x, int y)
{
return *(map.cases + y*map.height + x);
}

void setMapValue(Map* map, int value, int x, int y)
{
*(map->cases + y*map->height + x) = value;
}

那我有个问题。我想添加一个 struct Player,其中有两个 Map 元素,如下所示:

struct Player
{
Map map[2];
};

但这会导致错误array has incomplete element type。显然是因为数组的大小设置不正确,我应该如何使它起作用?

更新:我需要在 Player 结构之前编写 Map 结构。

最佳答案

“不完整类型”的问题很可能是因为您在定义struct Map 之前定义了struct Player

关于您的“2D”数组:使用 map->cases = malloc(sizeof(int) * width * height);,您实际上在类似于“真实”的布局中保留了内存二维数组,而数据类型 int **cases 表示指向 int 的指针。因此,如果您切换到 int *cases,它应该可以工作。

请注意 cases 仍然不是“真正的”二维数组,因为您不能像 map->cases[3][4] 那样访问它(这会产生未定义的行为)。但是无论如何,您在 getter 和 setter 函数中自行计算偏移量,因此您的实现应该可以工作。

关于无法在结构中声明二维动态数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47295731/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com