为指针数组动态分配空间
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]
,括号用于函数调用。
有人可以给我解释一下吗?指针一直是我当前 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]
,括号用于函数调用。