我有一个结构和这些结构的二维数组:
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];
[..]
答案 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
中的正确条目中。
这是你想要的吗?