Les variables locales sont stockées dans une forme de mémoire appelée mémoire de pile. Chaque fois qu'une fonction est appelée, les variables locales déclarées dans la fonction sont stockées sur la pile dans un ordre spécifique. Lorsque l'appel de fonction se termine, les variables locales sont supprimées de la pile dans l'ordre opposé, et l'adresse mémoire associée aux variables locales n'est plus valide. Cela indique que la variable locale ne peut plus être accessible en utilisant le pointeur qui a été précédemment utilisé.
Raisons de l'avertissement
Les raisons que cela avertissement peut se produire sont:
1: hors de portée
Si un pointeur est utilisé pour accéder à une variable locale après que l'adresse de la variable locale soit partie hors de portée, le "Adresse de la pile associée à la variable locale renvoyée"Sera lancé. Cela pourrait se produire si le pointeur utilisé pour accéder à la variable locale n'est pas correctement géré, ou si la fonction est sortie avant l'utilisation du pointeur. Pour résoudre ce problème, le pointeur doit d'abord être vérifié pour s'assurer qu'il est valide. Une fois le pointeur confirmé comme valide, le pointeur doit être géré correctement. Si le pointeur n'est pas géré correctement, le avertissement va persister.
Enfin, il est important de noter que le «Adresse de la pile associée à la variable locale renvoyée«Peut également être causé par d'autres avertissements, comme un débordement de pile, où la pile est remplie de plus de variables qu'elle ne peut contenir. Si un débordement de pile se produit, il est important de résoudre le problème sous-jacent qui a provoqué le débordement de la pile pour s'assurer que «Adresse de la pile associée à la variable locale renvoyée"N'est pas lancé.
Regardez cet exemple:
#inclure
char * getString ()
char s [100];
printf ("Entrez une chaîne:");
scanf ("% s", s);
Retour;
int main()
char * s = getString ();
printf ("vous avez entré:% s \ n", s);
retour 0;
Le getString () La méthode crée un tableau local Str sur la pile dans cet exemple et utilise scanf () Pour lire une chaîne de l'utilisateur.La fonction renvoie alors un pointeur vers cette variable locale Str. Le pointeur retourné est affecté à s dans le principal() Méthode, et il est imprimé en utilisant printf (). Néanmoins, puisque Str est une variable locale sur la pile et sa mémoire n'est plus utilisable lorsque le getTring () Les sorties de la méthode, cela conduira à un comportement indéfinissable.
Sortir
Nous pouvons utiliser malloc () ou une méthode similaire pour allouer dynamiquement la mémoire à la chaîne et renvoyer une référence à cette mémoire nouvellement créée pour empêcher cela avertissement et le comportement non défini qui a suivi. Voici une illustration de la façon de modifier le code précédent pour se débarrasser du avertissement:
#inclure
#inclure
char * getString ()
char * s = malloc (100 * sizeof (char));
printf ("Entrez une chaîne:");
scanf ("% s", s);
Retour;
int main()
char * s = getString ();
printf ("vous avez entré:% s \ n", s);
libre (s);
retour 0;
Dans le code mis à jour ci-dessus, nous allouons dynamiquement 100 octets de mémoire pour la chaîne en utilisant malloc () et renvoyer une référence à cette mémoire. Une fois que nous aurons en utilisant la mémoire, nous appelons gratuit() Pour le libérer. Nous contournons l'avertissement et garantissons que le RAM que nous utilisons est valable pour la durée de notre application en faisant cela.
Sortir
2: Mauvaise déclaration de variables locales
En plus de s'assurer que le pointeur est géré correctement, il est également important de s'assurer que le Les variables locales sont déclarées correctement. Si les variables sont déclarées dans le mauvais ordre ou si les variables sont déclarées au mauvais moment, l'avertissement peut se produire. Par exemple, si la variable locale est déclarée après la fin de la fonction, l'adresse de variable locale ne sera plus valide.
#inclure
int * add (int a, int b)
int sum = a + b;
Retour ∑
int main()
int * adresse = add (5, 6);
Le compilateur empêche la fonction de renvoyer l'adresse du somme depuis somme a été défini et initialisé dans le bloc fonctionnel, ce qui en fait une variable locale (en utilisant l'opérateur). Toutes les variables locales sont supprimées immédiatement à la fin de la fonction, donc l'instruction de retour ne doit pas renvoyer un pointeur qui comprend l'emplacement d'une variable locale (somme). Sinon, votre pointeur pointera sur une partie de la mémoire que vous n'avez plus de contrôle.
Sortir
L'adresse de retour est d'une variable locale, qui est un problème.Le correctif consiste à passer l'adresse en tant que paramètre à la fonction et à allouer dynamiquement la mémoire à une variable pour le maintenir. La variable n'est plus une variable locale car elle a été définie en dehors du bloc fonction.
Voir le code ici:
#inclure
#inclure
int * add (int a, int b, int * sum)
* sum = a + b;
somme de retour;
int main()
int * sum = malloc (sizeof (int));
ajouter (5, 6, somme);
printf ("La somme% d est stockée à l'adresse% p \ n", * sum, (void *) sum);
libre (somme);
retour 0;
Le code ci-dessus utilise le malloc () fonction pour allouer la mémoire à un entier et le ajouter() La fonction reçoit une référence à cette mémoire comme paramètre de somme. La fonction se multiplie un et b, Enregistre le résultat dans la mémoire mentionnée par SUM, puis renvoie SUM. Nous rapportons la valeur et l'emplacement de l'entier mentionné par Sum en principal(). Pour arrêter les fuites de mémoire, nous utilisons ensuite gratuit() Pour libérer la mémoire que Malloc a alloué.
Sortir
Conclusion
Le "Adresse de la pile associée à la variable locale renvoyée«Est un avertissement qui peut se produire lorsqu'un pointeur vers une variable locale est utilisé après que l'adresse de la variable locale est sortie de la portée. Pour empêcher cet avertissement de se produire, la bonne gestion du pointeur et les déclarations variables locales sont toutes deux importantes. Il est également crucial de confirmer qu'aucun autre avertissement ne provoque un débordement de pile. En suivant ces directives, le «Adresse de la pile associée à la variable locale renvoyée" peut être évité.