C语言:指针数组动态分配问题

6

我有一个结构体和一个该结构体的二维数组:

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个回答

9

实际上,我认为您需要

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

这将为您提供一个指向房间的指针数组。

1
在您当前的代码中,rooms 变成了一个 room 结构体数组,而不是指针数组。如果您想要一个指向您的 map 数组的指针数组,您需要再加一层间接引用:
room** rooms = malloc(ROOM_NUM * sizeof *rooms);
// ...
rooms[n] = &map[room_x][room_y];

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


1
在我看来,“rooms”应该是一种替代的、一维的访问“map”的方式,而不是二维的。 - JaakkoK
我不这么认为。他有ROOM_NUM个房间。我猜测ROOM_NUM等于地图尺寸的乘积。room***在2D数组中也行不通。 - Richard Pennington

1

我非常确定你想要的是:

sizeof(room)

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

如果你想要一个二维数组,你可能需要以不同的方式进行分配: 请参见这里 在C中动态分配数组的数组


1
顺便提一下,在这种情况下,在32位系统上sizeof(room)==sizeof(room*) :D - mingos

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

这不就像是创建了另一个房间的数组,而我想要的是一个指向房间的指针的数组吗? - pistacchio
啊,我明白你的意思了。其他一些帖子做得对。 - avpx

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

0

如果我理解正确,您想要一个指向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的正确条目中。
这是你想要的吗?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接