2016-09-16 1 views
2

(Ich glaube, diese Frage von Can a local variable's memory be accessed outside its scope? technisch verschieden ist, weil es ist C anstelle von C++.)Wird C den Speicher eines lokalen Blocks var wiederverwenden, wenn es den Gültigkeitsbereich verlässt?

Ich weiß, dass Sie in C eine lokale Variable in einem Block setzen können, und es wird zu diesem Block scoped werden:

Meine Frage ist, ist es trotzdem sicher, diesen Speicher bis zum Ende der Funktion zu verwenden? Ob es WISE aus Sicht der Design-/Coding-Praktiken ist, ist eine separate Frage, aber ist es ein undefiniertes Verhalten oder kann ich darauf zählen, dass das Gedächtnis bleibt? Zum Beispiel:

#include <stdio.h> 
int main() { 
    int *ptr; 

    { 
     int x = 5; 
     printf("x = '%d'\n", x); 

     // hold on to a ptr while we still know the address 
     ptr = &x; 
    } 

    // can't see x anymore, but is this safe? 
    printf("still have a ptr! '%d'\n", *ptr); 
} 

Vielen Dank!

Antwort

2

Die C99, 6.2.4 p2 Standard sagt:

Wenn ein Objekt außerhalb seiner Lebenszeit bezeichnet wird, das Verhalten ist nicht definiert. Der Wert eines Zeigers wird unbestimmt, wenn das Objekt, auf das er zeigt, das Ende seiner Lebensdauer erreicht.

+1

Danke für den Hinweis auf den Standard! – murftown

2

Ist es trotzdem SICHER, diesen Speicher bis zum Ende der Funktion zu verwenden?

Nein, ist es nicht. Sobald die Variable außerhalb des Gültigkeitsbereichs liegt, ist jeder Verweis auf den Speicher, den sie einmal belegt hat, ein undefiniertes Verhalten.

Hier ist eine kurze Demo mit UB passiert, wenn die Compiler-Speicher in einem Block zugeordnet Reuses:

int *ptr1, *ptr2; 
{ 
    int x[8]; 
    scanf("%d", x); 
    printf("You entered x=%d\n", x[0]); 
    ptr1 = x; 
} 
{ 
    int y[8]; 
    scanf("%d", y); 
    printf("You entered y=%d\n", y[0]); 
    ptr2 = y; 
} 
printf("Now x=%d\n", *ptr1); // <<== Undefined behavior!!! 
printf("Now y=%d\n", *ptr2); // <<== Undefined behavior!!! 

ich ein Array aus, da der Compiler für die Demo verwendet wählt Speicher der einzelnen Variablen nicht wiederverwenden und kleinen Arrays. Sobald ein bestimmter Schwellenwert überschritten ist, wird der Speicher jedoch wiederverwendet.

Demo.

Diese Demo zeigt, wie die Adresse von int x[8] für int y[8] wiederverwendet wird.

+0

Das ist ein gutes Beispiel, obwohl auf meinem Mac mit Wenn das nicht geschieht, bleiben die 2 Werte erhalten. Ich sehe, dass es jedoch nicht sicher ist über Architekturen/Compiler. Vielen Dank! – murftown

+0

@murftown Versuchen Sie, die Größe des Arrays zu erhöhen.Irgendwann, denke ich, sollte der Compiler den Speicher wiederverwenden. – dasblinkenlight

+0

Ich erhöhte ständig die Größe und konnte dieses Verhalten nicht sehen. Ich bekam stattdessen einen Stack Overflow, sobald meine Arrays 8M waren;) – murftown

0

Es ist undefiniertes Verhalten. Es kann auf einigen Architekturen oder Betriebssystemen funktionieren, aber zähle nicht darauf. Ein Beispiel dafür, wo es funktioniert, ist Linux, wobei red zone aktiviert ist.

1

Sie können nicht sicher sehen, auf was dieser Zeiger zeigt, sobald Sie außerhalb des Blocks sind, genau wie Sie vermuten.

Die "Speicherstelle", die für den Wert von X verwendet wurde, lebt natürlich weiter, so etwas ist wahrscheinlich dort zu sein. Aber Zugriff darauf hat kein garantiert sicheres Ergebnis; Sie werden wahrscheinlich Müll sehen, und in extremen Fällen könnte es sogar das Programm zum Absturz bringen. (Und für eine gewisse Zeit, könnten Sie feststellen, dass der ursprüngliche Wert von X noch vorhanden ist! Das ist ein Ablenkungsmanöver; es macht es nicht OK zu verwenden.)

+0

Richtig, das macht Sinn. Ich hatte etwas gehofft, dass C garantieren würde, diesen Punkt alleine zu verlassen, damit ich Javascript-style "private" Variablen haben könnte. Aber der Compiler, der die Möglichkeit hat, den lokalen Speicher zu recyceln, ist auch gut, also gut zu wissen! – murftown

+0

Rechts. Es gibt jedoch viele Möglichkeiten, um Informationen außerhalb eines Bereichs zu speichern, je nachdem, was Sie tun möchten. Stellen Sie eine neue Frage hier und Sie werden viele Ideen bekommen - Leute auf SO lieben alte Schule C Fragen. :) –

Verwandte Themen