2016-06-13 17 views
21

Während mit einem Kollegen von mir gesprochen, sagten sie, dass:Zugriff auf ein statisches Out of Scope undefiniertes Verhalten?

foo() { 
    int *p; 
    { 
     int x = 5; 
     p = &x; 
    } 
    int y = *p; 
} 

weil nicht definiertes Verhalten schafft Lebensdauer und den Anwendungsbereich Regeln halten nicht angeben. Jedoch

:

foo() { 
    int *p; 
    { 
     static int x = 5; 
     p = &x; 
    } 
    int y = *p; 
} 

ist nicht undefiniert! Sie haben Probleme mit dem "indirekten Scoping".

Die Verwendung der Terminologie klingt nicht korrekt.
Ich weiß, dass statische hat nichts mit Scoping zu tun.
Stimmt es, dass der zweite Fall ein definiertes Verhalten hat?

+0

Kommentare sind nicht für längere Diskussion; Diese Konversation wurde [in den Chat verschoben] (http://chat.stackoverflow.com/rooms/114724/discussion-on-question-by-trevor-hickey-is-accessing-a-static-out-of-scope- undef). –

Antwort

31

Ja der zweite Fall hat wohldefiniertes Verhalten. Eine static Variable ist im Grunde eine globale Variable, deren Name auf den Gültigkeitsbereich beschränkt ist, in dem sie deklariert ist. Sie wird initialisiert, wenn der Geltungsbereich das erste Mal eingegeben wird und dann für die gesamte Lebensdauer des Programms weiterlebt. So

, wenn wir erreichen

int y = *p; 

p zeigt auf eine Variable, die Sie nicht mehr erreichen kann (kann nicht auf diesen Code zurück), hat aber immer noch eine gültige Lebensdauer.

die Standard [basic.stc.static]

Alle Variablen zu zitieren, die keine dynamische Speicherdauer haben keine Gewinde Lagerdauer haben, und sind nicht lokale statische Speicherdauer haben. Der Speicher für diese Einheiten sind für die Dauer des Programms dauern

Hervorhebung von mir

Der erste Fall als die Lebensdauer des lokalen Bereich nicht definiert ist x am } endet und zu versuchen, beziehen Zu ihm nach seiner Lebenszeit endet, ist undefiniertes Verhalten.

+0

Im zweiten Fall ist '* p = 42; undefined? –

+3

@sunqingyao: Es ist gut, warum sollte es nicht sein? C erfordert nicht, dass Speicherorte Namen haben. Sonst wäre 'malloc' nutzlos. – rici

1

zitiert aus here

Der statischen Speicherklasse weist den Compiler eine lokale Variable in Existenz während der Lebenszeit des Programms zu halten, anstatt zu schaffen und es jedes Mal zu zerstören es in kommt und geht von Umfang. Wenn Sie also lokale Variablen statisch machen, können sie ihre Werte zwischen Funktionsaufrufen beibehalten.

also ja im zweiten Fall x existiert während der gesamten Lebensdauer des Programms.

hat daher ein definiertes Verhalten.

+1

Was zitierst du? – Barry

+0

Es gibt einen Unterschied zwischen statischem Speicher und dem statischen Spezifizierer ** _. – Olaf

+0

@Olaf können Sie bitte einige Links zu diesem Unterschied zwischen statischem Speicher und Speicherklassenspezifizierer angeben, so dass es für mich hilfreich ist, es besser zu verstehen? – mssirvi