动态分配指针数组的空间

时间:2015-02-24 04:50:52

标签: c arrays pointers realloc

有人可以向我解释一下吗?指针一直是我目前正在上课的最令人困惑的部分。

我有一个结构,我想包含一个指向另一个结构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循环中有一些增量)

2 个答案:

答案 0 :(得分:4)

这一行:

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

是您问题的最大来源。 基本上,你试图在d里面运行一个名为'monsters'的函数。 此外,编译器告诉你没有这样的功能。

你应该使用[]而不是(),这是你打算从你的怪物阵列中拾取一个元素。

然而,在realloc之后,怪物阵列只有{d - > num_monsters}个元素。

此外,您无法访问n个元素数组中的元素[n],因此这一行:

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

不起作用。 但这样做:

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

答案 1 :(得分:4)

此:

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

应该是:

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

sizeof 超级重要,如果没有它,你会大量分配不足,导致未定义的行为,因为你的代码写在分配的存储之外。

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