La portée de malloc utilisé dans une fonction
Lorsqu'une fonction retourne une valeur, est la mémoire allouée par malloc libéré? Ou peut-il encore être accessibles dans la fonction main() en utilisant les pointeurs?
par exemple.
void function(int *a)
{
a=(int *)malloc(sizeof(int));
*a=10;
}
int main()
{
int *num;
function(num);
printf("%d",*num);
return(0);
}
Peut l'entier stocké dans un être consulté par main() ici?
Vous devez vous connecter pour publier un commentaire.
Non, la mémoire allouée avec malloc n'est pas libérée lorsque vous quittez le champ d'application/de retour de la fonction.
Vous êtes responsable de la libération de la mémoire malloc.
Dans votre cas, cependant, la mémoire n'est PAS accessible dans main(), mais c'est parce que vous ne traitez qu'avec une variable locale.
Ici,
a
est une variable locale à l'intérieur defunction
. Les pointeurs sont passés par valeur en C, donca
reçoit une copie du pointeur en principal lorsque vous nefunction(num);
main() ne permet pas de voir que vous attribuez à cette copie locale du pointeur.Que vous avez à faire soit:
ou
malloc()
ed la mémoire est libérée lorsque vous appelezfree()
sur elle. Il peut être consulté par toute personne ayant un pointeur valide jusqu'à ce moment.Pas. Vous passez le pointeur de la
num
en valeur, d'où les modifications apportées par lefunction
ne seront pas reflétées dansmain
. Donc, effectivement il n'y a aucun moyen d'accéder à/libérer la mémoire allouée à partir demain
Pour y remédier, vous pouvez passer l'adresse de
num
ou de retoura
à partir de la fonction et de recueillir la valeur retournée dansnum
malloc fonctionne bien (si vous devez les appeler free() sur le pointeur, il retourne). Le problème ici est que vous ne pouvez pas retourner un pointeur vers la mémoire allouée.
"int * a", votre paramètre de la fonction() est l'adresse d'un entier. La façon habituelle de retour qui serait à réécrire votre fonction comme suit:
De retour par l'intermédiaire d'un paramètre, vous devez renvoyer l'adresse du pointeur:
Et maintenant vous savez pourquoi ils ont inventé C#.
Voici une façon de réécrire votre allocation chose si c'est plus clair:
Mémoire n'est pas libérée. Toute fonction peut allouer de la mémoire et tout autre peut désallouer. C'est un véritable gâchis si vous n'êtes pas super pointilleux, jusqu'à ce que... quelqu'un a inventé la Collecte des Ordures.
Vous pouvez stocker l'adresse directe de la mémoire allouée dans une liste de conteneurs, puis de créer une fonction de boucle, l'accès à chaque adresse dans une fonction libre, puis de la pop à l'adresse. Vous pouvez insérer l'adresse directement dans la fonction libre comme
free(myaddresslist.front()); myaddresslist.pop_front();
. C'est un quasi façon de faire votre propre collecte des ordures sans avoir à changer l'ensemble de votre projet de GC en fonction des langues. Utilisationmyaddresslist.size()
pour vous assurer de ne pas appeler free() sur un champ vide (résultant dans un accident) et de déterminer le nombre de boucles à prendre.