Wenn eine Variable innerhalb eines Codeblocks deklariert wird, definiert ihr Gültigkeitsbereich die Teile des Codes, auf die zugegriffen werden kann . Aber was passiert mit dem der Variablen zugewiesenen Speicher, wenn ihr Gültigkeitsbereich endet? Wird es sofort überschrieben oder bleibt es reserviert, bis die Funktion, in der es sich befindet, abgeschlossen wird?
Diese Frage ergibt sich aus dem folgenden Codeausschnitt:
foo() { int *p; { int x = 5; p = &x; } int y = *p; // undefined behavior }
Wenn der Speicher der Variablen x immer noch zugewiesen ist, nachdem er den Gültigkeitsbereich verlässt, zeigt der Zeiger p weiterhin auf die richtige Position, sodass wir auf den Wert von x zugreifen können, auch wenn er nicht mehr vorhanden ist Umfang.
Um dieses Rätsel zu lösen, müssen wir uns mit den Konzepten von Umfang und Lebensdauer befassen.
Umfang umfasst die Codeabschnitte, in denen Auf eine Variable kann zugegriffen werden. Wenn eine Variable in geschweiften Klammern ({}) deklariert wird, ist ihr Gültigkeitsbereich auf den eingeschlossenen Codeblock beschränkt.
Lebensdauer umfasst die Dauer, in der eine Variable oder Objekt existiert in einem gültigen Zustand. Bei automatischen oder lokalen nicht statischen Variablen ist ihre Lebensdauer auf ihren Gültigkeitsbereich beschränkt. Mit anderen Worten, diese Variablen werden automatisch zerstört, sobald ihr Gültigkeitsbereich endet.
Im angegebenen Codeausschnitt wird die Variable x als nicht statische lokale Variable deklariert , was bedeutet, dass seine Lebensdauer an seinen Umfang gebunden ist. Wenn der innere Bereich endet, hört x auf zu existieren und der Zeiger p zeigt auf eine Position, die nicht mehr gültig ist.
Daher ist der Versuch, über p auf den Wert von x zuzugreifen, ein undefiniertes Verhalten. Der Compiler weist x möglicherweise über seinen Gültigkeitsbereich hinaus Speicher zu, was zu unvorhersehbaren Ergebnissen führt. Daher ist es wichtig, den Zugriff auf Variablen zu vermeiden, deren Gültigkeitsbereich abgelaufen ist.
Das obige ist der detaillierte Inhalt vonWas passiert mit dem Variablenspeicher, nachdem sein Gültigkeitsbereich endet: Sofort überschrieben oder bis zum Abschluss der Funktion reserviert?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!