getaddrinfo addrinfo résultat dans stack ou tas

Je suis un peu confus au moins. getaddrinfo () call ‘met à jour’ un pointeur sur une structure addrinfo, tout va bien lorsque je vais utiliser addrinfo dans la même scope (cette fonction), mais que se passera-t-il si je copie la structure dans une autre (en l’assignant)

S’il vous plaît aidez-moi à comprendre les bases en cours (ne pas chercher des conseils pour des approches alternatives).

Corrigez-moi si je me trompe: a) getaddrinfo () nécessite un pointeur sur struct-pointeur vers addrinfo. b) getaddrinfo crée une structure addrinfo dans la scope de la fonction actuelle et met à jour le pointeur requirejs en a)

Maintenant, ma vraie question: je voudrais stocker cette addrinfo ailleurs. Utiliser une assignation à un autre pointeur ne fait pas une copie en profondeur, et après la fonction, tous les pointeurs deviennent invalides?

Mieux vaut donner un exemple extrêmement simplifié:

void GetAddrInfo(struct addrinfo *update) { struct addrinfo *res; getaddrinfo(xx,xx,xx,&res); //is this save? After this 'scope' ends all pointed fields are invalid? //this doesn't copy the linked list ai_next. *update=*res; } 

L’utilisation directe de & update sur getaddrinfo ne semble pas fonctionner car le problème persiste: la structure d’origine est détruite à la fin de la scope de la fonction.

Toute personne capable de me donner plus de perspicacité ici (veuillez expliquer ce qui est créé et détruit où, stack, amas, toutes les informations sont les bienvenues)

la structure d’origine est détruite à la fin de la scope de la fonction

Non, le pointeur de la structure est détruit. Le rest des données est toujours dans le tas. Ce serait une fuite de mémoire si vous n’appelez pas freeaddrinfo() lorsque vous avez terminé avec le résultat.

je voudrais stocker cet addrinfo ailleurs

Comme les données existent toujours, n’hésitez pas à copier le pointeur; pas besoin d’une copie en profondeur. De votre exemple:

 void GetAddrInfo(struct addrinfo **update) /* pointer to pointer */ { struct addrinfo *res; getaddrinfo(xx,xx,xx,&res); *update=res; /* save the pointer to the struct */ } 

Vous appelez simplement cette fonction avec:

 struct addrinfo *mycopy; GetAddrInfo(&mycopy); 

getaddrinfo alloue une liste de structures addrinfo et vous donne le pointeur sur l’en-tête de la liste. Vous libérez toute la mémoire allouée en passant ce pointeur à freeaddrinfo lorsque vous avez terminé.

Ce que vous faites est assez sûr, mais perd de la mémoire.

 void GetAddrInfo(struct addrinfo **update) { getaddrinfo(xx,xx,xx,update); } addrinfo * myai; GetAddrInfo(&myai); freeaddrinfo(myai) 

Cette approche ne perd pas de mémoire – vous récupérez simplement un pointeur sur la tête de liste addrinfo.