c语言 - 无法在结构中声明 2D 动态数组



所以我有2个问题。

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

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("Errorn");
        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;
}

然后我有一个问题。我想添加一个结构播放器,其中包含两个 Map 元素,如下所示:

struct Player
{
    Map map[2];
};

但这会导致错误array has incomplete element type。显然是因为数组的大小设置不正确,我应该如何做到这一点?

更新:我需要在播放器结构之前编写地图结构。

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

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

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

真的不知道我是否有内存泄漏或一些我没有看到的错误。

是的。 在分配过程中,您有一些内存问题,@StephanLechner 已指出这些问题。

此外,您还有一个算术错误,该错误索引了错误的元素并在数组边界之外进行了索引。 您的x值范围从 0width-1y值的范围从 0height-1 。 每次递增y实际上都在移动数组中的width元素。 所以:

return *(map.cases + y*map.height + x);

应该是:

return *(map.cases + y*map.width + x);

相关内容

  • 没有找到相关文章

最新更新