Lokale variabler lagres i en form for minne som kalles stabelminne. Hver gang en funksjon kalles, lagres de lokale variablene som er deklarert i funksjonen på bunken i en bestemt rekkefølge. Når funksjonsanropet slutter, fjernes de lokale variablene fra stabelen i motsatt rekkefølge de ble lagret, og minneadressen tilknyttet de lokale variablene er ikke lenger gyldig. Dette indikerer at den lokale variabelen ikke lenger kan nås ved hjelp av pekeren som tidligere ble brukt.
Årsaker til advarselen
Årsakene til at dette advarsel kan oppstå er:
1: Out of Scope
Hvis en peker brukes til å få tilgang til en lokal variabel etter at adressen til den lokale variabelen har gått ut av omfang, “Adresse til stabel tilknyttet lokal variabel returnert”Vil bli kastet. Dette kan skje hvis pekeren som brukes til å få tilgang til den lokale variabelen ikke administreres riktig, eller hvis funksjonen blir forlatt før pekeren brukes. For å løse dette problemet, må pekeren først sjekkes for å sikre at den er gyldig. Når pekeren er bekreftet å være gyldig, må pekeren håndteres riktig. Hvis pekeren ikke håndteres ordentlig, er det advarsel vil vedvare.
Til slutt er det viktig å merke seg at "Adresse til stabel tilknyttet lokal variabel returnert”Kan også være forårsaket av andre advarsler, for eksempel en bunkeoverløp, der stabelen er fylt med flere variabler enn den kan holde. Hvis det oppstår en bunkeoverløp, er det viktig å fikse det underliggende problemet som fikk stabelen til å strømme over for å sikre "Adresse til stabel tilknyttet lokal variabel returnert”Blir ikke kastet.
Se på dette eksemplet:
#inkludere
char* getString ()
Char S [100];
printf ("Skriv inn en streng:");
scanf ("%s", s);
return s;
int main ()
char* s = getString ();
printf ("du skrev inn: %s \ n", s);
retur 0;
De GetString () Metode skaper en lokal matrise str på stabelen i dette eksemplet og bruker Scanf () å lese en streng fra brukeren.Funksjonen returnerer deretter en peker til denne lokale variabelen STR. Den returnerte pekeren er tilordnet s i hoved() metode, og den er trykt ved hjelp av printf (). Likevel, siden str er en lokal variabel på stabelen og minnet er ikke lenger brukbar når getTring () metodeutganger, dette vil føre til udefinerbar oppførsel.
Produksjon
Vi kan bruke Malloc () eller en lignende metode som dynamisk tildeler minnet for strengen og returnerer en referanse til dette nyopprettede minnet for å forhindre dette advarsel og den påfølgende udefinerte oppførselen. Her er en illustrasjon av hvordan du endrer den foregående koden for å bli kvitt advarsel:
#inkludere
#inkludere
char* getString ()
char * s = malloc (100 * sizeof (char));
printf ("Skriv inn en streng:");
scanf ("%s", s);
return s;
int main ()
char* s = getString ();
printf ("du skrev inn: %s \ n", s);
gratis (er);
retur 0;
I ovennevnte kode tildeler vi dynamisk 100 byte av minne for strengen ved hjelp av Malloc () og returner en referanse til dette minnet. Når vi er gjennom å bruke minnet, ringer vi gratis() å frigjøre den. Vi sider for advarselen og garanterer at RAM vi bruker er gyldig i løpet av vår søknad ved å gjøre dette.
Produksjon
2: Feil erklæring om lokale variabler
I tillegg til å sikre at pekeren håndteres riktig, er det også viktig å sørge for at Lokale variabler er deklarert riktig. Hvis variablene er deklarert i feil rekkefølge, eller hvis variablene er deklarert til feil tid, kan advarselen oppstå. For eksempel, hvis den lokale variabelen er deklarert etter at funksjonen er slutt, vil den lokale variabelen ikke lenger være gyldig.
#inkludere
int* Legg til (int a, int b)
int sum = a + b;
Returner ∑
int main ()
int* adresse = legg til (5, 6);
Kompilatoren forhindrer at funksjonen returnerer adressen til sum siden sum ble definert og initialisert i funksjonsblokken, noe som gjorde den til en lokal variabel (ved hjelp av & operatøren). Alle lokale variabler blir slettet umiddelbart etter hvert som funksjonen går ut, og dermed skal returerklæringen ikke returnere en peker som inkluderer plasseringen av en lokal variabel (sum). Hvis ikke, vil pekeren din peke på en del av minnet som du ikke lenger har kontroll over.
Produksjon
Returadressen er av en lokal variabel, noe som er et problem.Løsningen er å passere adressen som en parameter til funksjonen og fordele minne dynamisk til en variabel for å holde den. Variabelen er ikke lenger en lokal variabel fordi den er definert utenfor funksjonsblokken.
Se koden her:
#inkludere
#inkludere
int* add (int a, int b, int* sum)
*sum = a + b;
retursum;
int main ()
int* sum = malloc (sizeof (int));
Legg til (5, 6, sum);
printf ("Summen %d er lagret ved adresse %p \ n", *sum, (ugyldig *) sum);
gratis (sum);
retur 0;
Ovennevnte kode bruker Malloc () funksjon for å tildele minne for et heltall, og Legg til() Funksjonen mottar en referanse til dette minnet som sumparameter. Funksjonen multipliserer en og b, Lagrer utfallet i minnet referert til av summen, og returnerer deretter summen. Vi rapporterer verdien og plasseringen av heltallet referert til av summen i hoved(). For å stoppe minnelekkasjer, bruker vi deretter gratis() å frigjøre minnet som Malloc tildelte.
Produksjon
Konklusjon
“Adresse til stabel tilknyttet lokal variabel returnert”Er en advarsel som kan oppstå når en peker til en lokal variabel brukes etter at adressen til den lokale variabelen har gått ut av omfang. For å forhindre at denne advarselen oppstår, er riktig pekerstyring og lokale variable erklæringer begge viktige. Det er også avgjørende å bekrefte at ingen andre advarsler forårsaker en bunkeoverløp. Ved å følge disse retningslinjene, "Adresse til stabel tilknyttet lokal variabel returnert”Kan unngås.