Comment libérer un pointeur renvoyé par une fonction?

#include  #include  #include  char* f(void) { char *x; x = malloc(sizeof(char) * 4); strcpy(x, "abc"); return(x); } int main(void) { char *a; a = f(); printf("%s", a); free(a); return(0); } 

La variable x de la fonction doit-elle être libérée? Si oui, comment est-ce possible quand je dois le retourner?

La variable x de la fonction doit-elle être libérée?

Oui (un peu, voir mon dernier commentaire). Chaque appel à malloc nécessite un appel ultérieur à free . Sinon, vous avez une fuite. Rappelez-vous cependant; vous n’êtes pas “libérez x “, vous libérez la mémoire à laquelle x fait référence.

Lorsque vous renvoyez x une copie de la valeur (une adresse) de x est créée et renvoyée à l’appelant. x été déclaré avec la durée de stockage automatique. C’est la mémoire à laquelle il fait référence qui doit être libérée.

Si oui, comment est-ce possible quand je dois le retourner.

Votre conception a obligé l’appelant à libérer la mémoire. Vous avez déjà fait cela en main. Bien sûr, l’utilisation de cette méthode nécessite que vous documentiez la fonction afin que les utilisateurs de votre code sachent qu’ils reçoivent une adresse mémoire allouée dynamicment.

Une meilleure approche (IMO) consiste à prendre un tampon en tant que paramètre d’entrée. Maintenant, il est très clair qui est responsable de la gestion de cette mémoire (c.-à-d. L’appelant). Peut-être que je ne veux même pas l’allouer dynamicment. Avec ce design c’est mon choix.

 void f(char *buf, size_t buf_size) { strncpy(buf, "abc", buf_size - 1); buf[buf_size-1] = '\0'; } 

Sur une note de côté, vous devriez toujours vérifier la valeur de retour de malloc . Il peut échouer, auquel cas un pointeur nul sera renvoyé. En outre, sizeof(char) est garanti 1 par la norme, vous pouvez donc supprimer ce bit et simplement dire malloc(n) .

Oui, il devrait être libéré par l’appelant. Tels que le free dans votre main.

Lorsque vous renvoyez x dans la fonction f , une copie de l’adresse est renvoyée à l’appelant. L’appelant peut appeler free à cette adresse.

Oui, vous devez libérer, mais il est déjà libéré lorsque vous le faites free(a); in main (puisque a est assigné à être égal à x dans la ligne a = f(); ).

x est détruit après la sortie de la fonction. La valeur de x est une adresse qui pointe vers un object alloué dynamicment. L’object existe toujours après que vous ayez quitté la fonction.

Pour libérer l’object dynamicment, vous devez transmettre la valeur de x renvoyée par la fonction f à la fonction free .

Lorsque vous appelez malloc il alloue de la mémoire et renvoie l’adresse initiale de ce bloc de mémoire.

Dans votre cas, vous renvoyez cette adresse à l’appelé, à présent l’appelé, principal, est chargé de la désallouer.

La seule chose nécessaire pour désallouer un bloc de mémoire est l’adresse initiale. AFIK, le système d’exploitation est en charge de l’allocation / libération de la mémoire. Il utilise des algorithmes assez complexes, mais les programmes doivent simplement garder trace de l’adresse de la mémoire initiale. Cette adresse peut être stockée ou déplacée comme n’importe quelle autre valeur entière car dans les systèmes 32 bits, il ne s’agit que d’une valeur int.

Votre code fonctionne bien, vous avez libéré a chaîne qui est la chaîne mallocée par f.