gpt4 book ai didi

c - 如何使一个字段指向它的结构?

转载 作者:行者123 更新时间:2023-12-05 01:29:42 26 4
gpt4 key购买 nike

总结一下我有两个结构,itemplayerplayer结构包含两个item结构在其领域。
item 结构有一个字段,它是一个指向 player 结构的指针,这个指针必须指向拥有这个项目的玩家。
当我初始化我想要制作的 new_player() 播放器,以便项目指向在函数内创建的 player
对我来说这似乎是不可能的,因为项目将指向在堆栈上创建的结构,一旦返回结构,其项目成员将指向释放的内存。我做了一些测试,似乎证实了这个理论。

代码:

struct item
{
int power;
struct player* owner;
};
struct item new_item(int power, struct player* owner)
{
struct item an_item;

an_item.power = power;
an_item.owner = owner;

return an_item;
}

struct player
{
int age;
struct item item_1;
struct item item_2;
};
struct player new_player(int age)
{
struct player a_player;
a_player.age = age;
a_player.item_1 = new_item(1, &a_player);
a_player.item_2 = new_item(2, &a_player);

return a_player;
}

对此的解决方案可能是使用 new_player() 返回指向 player 的指针并将其分配到堆上:

struct player* new_player(int age)
{
struct player* a_player = malloc(sizeof (struct player));
a_player->age = age;
a_player->item_1 = new_item(1, a_player);
a_player->item_2 = new_item(2, a_player);

return a_player;
}

测试:

int main()
{
struct player* player_1 = new_player(77);

printf("Age of the player: %d.\n", player_1->age);
printf("Age of the player (from item_1): %d.\n", player_1->item_1.owner->age);
printf("Age of the player (from item_2): %d.\n", player_1->item_2.owner->age);

printf("Age of the player (from item_1 by owner): %d.\n",
player_1->item_1.owner->item_1.owner->age);
printf("Age of the player (from item_2 by owner): %d.\n",
player_1->item_2.owner->item_2.owner->age);

printf("Age of the player (from item_1 by owner to item_2): %d.\n",
player_1->item_1.owner->item_2.owner->age);
printf("Age of the player (from item_2 by owner to item_1): %d.\n",
player_1->item_2.owner->item_1.owner->age);

printf("Power of the first item: %d, power of the second item: %d.\n",
player_1->item_1.power, player_1->item_2.power);
printf("Power of the first item (from item_1): %d, power of the first item (from item_2): %d.\n",
player_1->item_1.owner->item_1.power, player_1->item_2.owner->item_1.power);
printf("Power of the second item (from item_1): %d, power of the second item (from item_2): %d.\n",
player_1->item_1.owner->item_2.power, player_1->item_2.owner->item_2.power);

free(player_1);

return 0;
}

一些经验丰富的 C 程序员能否就什么是最好的方法(或其他我没有考虑过的方法)给我建议?

最佳答案

在您拥有的播放器结构中,项目是播放器的一部分。因此,当您在堆上分配播放器时,只需将项目内的播放器指针设置为新创建的播放器即可。

你是对的,如果你在堆栈上创建播放器,这将不起作用,因为返回后,播放器对象将被复制,包括指向项目的指针(然后指向堆栈上的玩家)。

另一种经常使用的解决方案是在 new_player 函数之外分配播放器并将其作为指针传入:

void new_item(struct item *i, int power, struct player *p) {
i->owner = p;
i->power = power;
}

void new_player(struct player *p, int age) {
p->age = age;
new_item(&p->item_1, 1, p);
new_item(&p->item_2, 2, p);
}

struct player p;
new_player(&p, 10);

通过这种方式,您可以将对象的分配与初始化分离。例如,您可以拥有一大堆玩家对象,其中包含所有玩家并且只分配一次。然后通过传入指向数组中对象的指针来初始化播放器对象。

或者您可以堆分配播放器并使用相同的函数对其进行初始化。

关于c - 如何使一个字段指向它的结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35058328/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com