有人可以向我解释一下吗?指针一直是我目前正在上课的最令人困惑的部分。
我有一个结构,我想包含一个指向另一个结构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循环中有一些增量)
答案 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]
,括号用于函数调用。