为指针数组动态分配空间

Dynamically allocating room for a pointer array

有人可以给我解释一下吗?指针一直是我当前 class 中最令人困惑的部分。

我有一个结构,我想包含指向另一个结构的指针数组 npc_t,就像这样

typedef struct dungeon {
  int num_monsters;
  struct npc_t *monsters;
} dungeon;

然后我想在我初始化一个新的怪物时动态分配空间给数组monsters。我目前有

//add to dungeon's list of monsters
realloc(d->monsters, d->num_monsters);
d->monsters(d->num_monsters) = m;
d->num_monsters++;

其中 num_monsters 初始化为 0。

我在编译时收到此消息

npc.c: In function ‘init_monster’:
npc.c:65:13: error: called object is not a function or function pointer
  d->monsters(d->num_monsters) = m;
             ^
npc.c:64:9: warning: ignoring return value of ‘realloc’, declared with    attribute warn_unused_result [-Wunused-result]
  realloc(d->monsters, d->num_monsters);
         ^
make: *** [npc.o] Error 1

我的做法是否正确?我可以使用 d->monsters(d->num_monsters)d->monsters(i) 之类的东西来抓取我想要的怪物吗? (例如,如果 i 是 for 循环中的一些增量)

这一行:

d->monsters(d->num_monsters) = m;

是你问题的最大根源。 基本上,您正在尝试 运行 一个名为 'monsters' 的函数 inside d。 另外,编译器告诉你没有这样的函数。

你应该使用 [ ] 而不是 (),这是你从你的怪物数组中选取一个元素的意图。

但是,在重新分配之后,怪物数组只有 {d -> num_monsters} 个元素。

此外,您不能访问 n 个元素的数组中的元素 [n],所以这一行:

d->monsters[d->num_monsters] = m;

将不起作用。 但这样就可以了:

d->monsters[d->num_monsters - 1] = m;

这个:

realloc(d->monsters, d->num_monsters);

应该是:

d->monsters = realloc(d->monsters, d->num_monsters * sizeof *d->monsters);

sizeof 非常重要,没有它,您的分配就会大量不足,这将导致未定义的行为,因为您的代码在分配的范围之外写入存储空间。

此外,正确的数组索引语法是 a[i],括号用于函数调用。