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

时间:2010-01-07 23:23:51

标签: 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];
[..]

6 个答案:

答案 0 :(得分:9)

实际上,我认为你想要

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

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

答案 1 :(得分:1)

我很确定你想要

sizeof(room)

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

如果您想要2D数组,您可能还需要进行不同的分配: 请参阅此处 dynamic allocating array of arrays in C

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

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

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

答案 4 :(得分:0)

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

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];

答案 5 :(得分:0)

如果我理解正确,您需要一个指向room中所有map值的指针数组。由于有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中的正确条目中。

这是你想要的吗?