Die Verwendung einer C -String gibt eine Warnung „Adresse des Stapelspeichers zugeordnet, die mit der zurückgegebenen lokalen Variablen verknüpft sind“ - Fix

Die Verwendung einer C -String gibt eine Warnung „Adresse des Stapelspeichers zugeordnet, die mit der zurückgegebenen lokalen Variablen verknüpft sind“ - Fix
Einer der häufigsten Warnungen Dies kann bei der Verwendung einer C -Programmiersprache auftreten, die die “istAdresse des mit der lokalen Variablen zurückgegebenen Stapels”. Das Warnung kann auftreten, wenn auf den Speicher, der einer lokalen Variablen zugeordnet ist. Um es anders auszudrücken, ist die Referenz der lokalen Variablen nicht mehr stabil. Um das besser zu verstehen Warnung, Es ist wichtig, das Konzept des Stack -Gedächtnisses zu verstehen und wie es sich auf lokale Variablen bezieht.

Lokale Variablen werden in einer Form des Speichers als Stack Memory gespeichert. Jedes Mal, wenn eine Funktion aufgerufen wird, werden die in der Funktion deklarierten lokalen Variablen in einer bestimmten Reihenfolge auf dem Stapel gespeichert. Wenn der Funktionsaufruf endet, werden die lokalen Variablen in der entgegengesetzten Reihenfolge aus dem Stapel entfernt, und die mit den lokalen Variablen verknüpfte Speicheradresse ist nicht mehr gültig. Dies zeigt an, dass auf die lokale Variable nicht mehr mit dem zuvor verwendeten Zeiger zugegriffen werden kann.

Gründe der Warnung

Die Gründe dafür Warnung können auftreten::

1: Aus dem Zielfernrohr

Wenn ein Zeiger verwendet wird, um nach der Adresse der lokalen Variablen auf eine lokale Variable zuzugreifen außer Reichweite, Die "Adresse des mit der lokalen Variablen zurückgegebenen Stapels”Wird geworfen. Dies kann passieren, wenn der Zeiger, der zum Zugriff auf die lokale Variable verwendet wird. Um dieses Problem zu beheben, muss der Zeiger zuerst überprüft werden, um sicherzustellen, dass es gültig ist. Sobald der Zeiger als gültig bestätigt wird, muss der Zeiger korrekt behandelt werden. Wenn der Zeiger nicht richtig behandelt wird, der Warnung wird bestehen bleiben.

Schließlich ist es wichtig zu beachten, dass das “Adresse des mit der lokalen Variablen zurückgegebenen StapelsKann auch durch andere verursacht werden Warnungen, wie ein Stapelüberlauf, bei dem der Stapel mit mehr Variablen gefüllt ist, als er halten kann. Wenn ein Stapelüberlauf auftritt, ist es wichtig, das zugrunde liegende Problem zu beheben, das den Stapel zum Überlauf hat, um das zu gewährleistenAdresse des mit der lokalen Variablen zurückgegebenen Stapels”Wird nicht geworfen.

Sehen Sie sich dieses Beispiel an:

#enthalten
char* getstring ()
char s [100];
printf ("eine Zeichenfolge eingeben:");
scanf ("%s", s);
kehrt zurück;

int main ()
char* s = getstring ();
printf ("Sie haben eingegeben: %s \ n", s);
Rückkehr 0;

Der GetString () Methode erstellt ein lokales Array str Auf dem Stapel in diesem Beispiel und verwendet scanf () Um eine Zeichenfolge vom Benutzer zu lesen.Die Funktion gibt dann einen Zeiger auf diese lokale Variable -STR zurück. Der zurückgegebene Zeiger wird zugewiesen S im hauptsächlich() Methode, und es wird mit verwendet printf (). Trotzdem seitdem str ist eine lokale Variable auf dem Stapel und sein Gedächtnis ist nicht mehr verwendet, wenn der Gettring () Methodenausgänge, dies führt zu undefinierbarem Verhalten.

Ausgang

Wir können verwenden malloc () oder eine ähnliche Methode, um den Speicher für die Zeichenfolge dynamisch zuzuweisen und einen Verweis auf diesen neu erstellten Speicher zurückzugeben, um dies zu verhindern Warnung und das folgende undefinierte Verhalten. Hier ist ein Beispiel dafür Warnung:

#enthalten
#enthalten
char* getstring ()
char * s = malloc (100 * sizeof (char));
printf ("eine Zeichenfolge eingeben:");
scanf ("%s", s);
kehrt zurück;

int main ()
char* s = getstring ();
printf ("Sie haben eingegeben: %s \ n", s);
frei (s);
Rückkehr 0;

In dem obigen aktualisierten Code weisen wir dynamisch zu 100 Bytes von Speicher für die Zeichenfolge verwenden malloc () und geben Sie einen Verweis auf diesen Speicher zurück. Sobald wir den Speicher verwenden, rufen wir an frei() es freigeben. Wir gehen die Warnung um und garantieren, dass der von uns verwendete RAM für die Dauer unserer Anwendung gültig ist.

Ausgang

2: falsche Deklaration lokaler Variablen

Neben der richtigen Handhabung des Zeigers ist es auch wichtig, dass die Lokale Variablen werden korrekt deklariert. Wenn die Variablen in der falschen Reihenfolge deklariert werden oder wenn die Variablen zum falschen Zeitpunkt deklariert werden, kann die Warnung auftreten. Wenn beispielsweise die lokale Variable nach Ende der Funktion deklariert wird, ist die lokale Variablenadresse nicht mehr gültig.

#enthalten
int* add (int a, int b)

int sum = a + b;
return ∑

int main ()
int* address = add (5, 6);

Der Compiler verhindert, dass die Funktion die Adresse der Adresse zurückgibt Summe seit Summe wurde im Funktionsblock definiert und initialisiert, wodurch es eine lokale Variable gemacht wurde (unter Verwendung des & Operators). Alle lokal (Summe). Wenn nicht, zeigt Ihr Zeiger auf einen Teil des Speichers, über den Sie keine Kontrolle mehr haben.

Ausgang

Die Absenderadresse hat eine lokale Variable, was ein Problem darstellt.Die Korrektur besteht darin, die Adresse als Parameter an die Funktion zu übergeben und Speicher für eine Variable dynamisch zuzuordnen, um sie zu halten. Die Variable ist keine lokale Variable mehr, da sie außerhalb des Funktionsblocks definiert wurde.

Siehe den Code hier:

#enthalten
#enthalten
int* add (int a, int b, int* sum)

*sum = a + b;
Rückgabesumme;

int main ()
int* sum = malloc (sizeof (int));
add (5, 6, sum);
printf ("Der Summe %d wird unter der Adresse %p \ n", *sum, (void *) sum gespeichert;
frei (sum);
Rückkehr 0;

Der obige Code verwendet die malloc () Funktionen zur Zuordnung eines Speichers für eine Ganzzahl und die hinzufügen() Die Funktion empfängt einen Verweis auf diesen Speicher als Summenparameter. Die Funktion multipliziert A Und B, Speichert das Ergebnis im Speicher, auf den die Summe genannt wird, und gibt dann die Summe zurück. Wir melden den Wert und den Ort der Ganzzahl, auf die Summe in bezeichnet wird hauptsächlich(). Um Speicherlecks zu stoppen, verwenden wir dann frei() den Speicher, den Malloc zugewiesen hat.

Ausgang

Abschluss

Der "Adresse des mit der lokalen Variablen zurückgegebenen Stapels”Ist eine Warnung, die auftreten kann, wenn ein Zeiger auf eine lokale Variable verwendet wird, nachdem die Adresse der lokalen Variablen aus dem Umfang gegangen ist. Um zu verhindern, dass diese Warnung auftritt, sind die richtigen Zeigermanagements und lokale variable Erklärungen wichtig. Es ist auch wichtig zu bestätigen, dass keine anderen Warnungen einen Stapelüberlauf verursachen. Durch die Befolgung dieser Richtlinien die “Adresse des mit der lokalen Variablen zurückgegebenen Stapels" kann vermieden werden.