c - How to make so that a field points to its structure? -


to sum have 2 structures, item , player, player structure contains 2 item structure in fields.
item structure have field pointer player structure, pointer must points player owns item.
when initialize player whith new_player() want make items points player being created inside function.
me doesn't seems possible because items points structure created on stack, once structure returned items members points freed memory. made few tests seems confirm theory.

code:

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; } 

a solution return pointer player new_player() , allocate on heap:

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; } 

tests:

int main() {     struct player* player_1 = new_player(77);      printf("age of player: %d.\n", player_1->age);     printf("age of player (from item_1): %d.\n", player_1->item_1.owner->age);     printf("age of player (from item_2): %d.\n", player_1->item_2.owner->age);      printf("age of player (from item_1 owner): %d.\n",             player_1->item_1.owner->item_1.owner->age);     printf("age of player (from item_2 owner): %d.\n",             player_1->item_2.owner->item_2.owner->age);      printf("age of player (from item_1 owner item_2): %d.\n",             player_1->item_1.owner->item_2.owner->age);     printf("age of player (from item_2 owner item_1): %d.\n",             player_1->item_2.owner->item_1.owner->age);      printf("power of first item: %d, power of second item: %d.\n",             player_1->item_1.power, player_1->item_2.power);     printf("power of first item (from item_1): %d, power of 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 second item (from item_1): %d, power of 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; } 

could experimented c programmers give me advices on best way (or others ways haven't thinked about)?

in player struct have, items parts of player. when allocate player on heap, can set player pointer inside items newly created player.

you right that, if create player on stack, not work, because after returning, player object copied, including pointers items (which point "previous" location of player on stack).

another solution, used, allocate player outside of new_player function , pass in pointer:

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); 

this way can decouple allocation of objects initialization. example, have big array of player objects holds players , allocated once. initialize player objects passing in pointers objects in array.

or heap-allocate player , initialize same function.


Comments

Popular posts from this blog

Hatching array of circles in AutoCAD using c# -

ios - UITEXTFIELD InputView Uipicker not working in swift -

Python Pig Latin Translator -