C:指向结构数组的动态指针数组

我有一个结构和这些结构的二维数组:

typedef struct { char exit_n; char exit_s; char exit_w; char exit_e; } room; room map[MAP_WIDTH][MAP_HEIGHT]; 

我需要一个指针数组结构。 以下代码编译,但我没有得到想要的结果。 有帮助吗? 这对我来说真的很困惑,任何解释都会受到赞赏

 room *rooms; rooms = (room*)malloc(sizeof(room*) * ROOM_NUM); [..] rooms[n] = map[room_x][room_y]; [..] 

实际上,我想你想要

 room** rooms; rooms = (room**)malloc(sizeof(room*) * ROOM_NUM); [..] rooms[n] = &map[room_x][room_y]; 

这会为您提供一系列指向您房间的指针。

我很确定你想要的

 sizeof(room) 

您需要为结构分配足够的空间。 你只是为指针分配。

如果需要2D数组,也可能需要以不同的方式进行分配:请参阅此处动态分配C中的数组数组

我看到的主要问题是你使用的是sizeof(room*) 。 这意味着您将获取指向结构的指针的大小,这不是您想要的。 您想要分配结构的大小,因此请将sizeof(room) 。 此外,在这种情况下使用calloc ,而不是malloc ,因为您基本上通过将房间数乘以房间大小来实现前者的function。

在您当前的代码中, rooms变成了一个room结构数组,而不是一个指针数组。 如果你想要一个指针数组,每个指针指向你的map数组,你需要另一层间接:

 room** rooms = malloc(ROOM_NUM * sizeof *rooms); // ... rooms[n] = &map[room_x][room_y]; 

(或者您可以使用sizeof (room *)代码而不是sizeof *rooms ;我更喜欢以这种方式编写它以避免重复类型信息。)

您需要为指针和房间分配空间,然后初始化指针以指向房间。

 room *rooms; room **prooms; rooms = (room*)malloc((sizeof(room) + sizeof(room*)) * ROOM_NUM); prooms = (room**)(&rooms[ROOM_NUM]); for (int ii = 0; ii < ROOM_NUM; ++ii) prooms[ii] = &rooms[ii]; 

如果我理解正确,你需要一个指向map所有room值的指针数组。 由于MAP_WIDTH*MAP_HEIGHT这样的值,我们需要很多指针:

 room *rooms[MAP_WIDTH*MAP_HEIGHT]; 

上面将rooms声明为指针数组。

现在,要分配值:

 size_t i; size_t j; for (i=0; i < MAP_WIDTH; ++i) for (j=0; j < MAP_HEIGHT; ++j) rooms[i*MAP_HEIGHT+j] = &map[i][j]; 

我们基本上在map找到每个元素的地址,并将其存储在rooms中的正确条目中。

这是你想要的吗?