2010-12-27 2 views

Antwort

24

Es gibt keine Garantie.

Sobald v außerhalb des Geltungsbereichs geht, wird alles mit ihm überhaupt (auch über einen Zeiger) als Undefined Behavior betrachtet.

Wie bei jedem anderen undefinierten Verhalten, nur weil es auf einem Betriebssystem, Compiler, Compiler-Version, Tageszeit usw. funktioniert, heißt das nicht, dass es für einen anderen funktioniert.

+3

In diesem speziellen Fall können Sie auch Unterschiede im Verhalten abhängig von den Compiler-Optimierungseinstellungen bemerken. Auch hier ist nichts in Stein gemeißelt, weil der C-Standard hier nicht definiert, was passieren soll. –

8

auf Merlyn Antwort hinzuzufügen, ein Fall, in dem dies wahrscheinlich im Verhalten führen würde man nicht beabsichtigte, ist die folgende:

#include <stdio.h> 
int main(){ 
    int *p; 
    { 
     int v = 1; 
     p = &v; 
    } 
    { 
     int w = 2; 
     printf("%d\n", w); 
    } 
    printf("%d\n", *p); 
    return 0; 
} 

Der Compiler dies auf die gleiche Zuordnung, indem v und w Aktien optimieren kann der Stapel. Auch hier könnte der Compiler das nicht optimieren - deshalb ist das Verhalten der Verwendung von Zeigern auf Variablen nach ihren umschließenden Blockenden nicht definiert. Das Programm könnte "2" und "1" oder "2" und "2" oder "2" ausgeben und je nachdem, welcher Compiler und welche Einstellungen verwendet werden, etwas völlig anderes.

+3

Ihr letzter Absatz ist falsch. Laut C99 §6.8.5.3, "Wenn Klausel 1 eine Deklaration ist, ist der Geltungsbereich der von ihm deklarierten Identifizierer der Rest der Deklaration und die gesamte Schleife, einschließlich der anderen zwei Ausdrücke" Es ist * nicht * im Umfang für die Rest von Haupt. –

+1

@Matthew: Sind Sie sicher, dass bezieht sich auf Lebensdauer und nicht nur lexikalischen Umfang? – cdhowie

+1

Ich glaube, es ist beides. In der Fußnote heißt es: "In Klausel 1 wird also die Initialisierung für die Schleife spezifiziert, wobei möglicherweise eine oder mehrere Variablen ** für die Verwendung in der Schleife deklariert werden **" (Hervorhebung hinzugefügt). Der C++ - Standard (§ 6.5.3) erklärt es klarer (aber ich glaube äquivalent) und zeigt, wie ein simulierter Block erzeugt wird. –

0

ya es wird manchmal funktionieren, aber man kann nicht sicher sein, dass es funktioniert ... Es ist manchmal verursacht nicht nur Bus-Fehler, sondern auch den ganzen Programmabsturz verursacht ...

ich u ein Beispiel

werfen sie einen Blick auf diese .. http://www.functionx.com/cpp/examples/returnreference.htm

hier versucht er, die Referenz einer variablen zurück, die den Gültigkeitsbereich verlässt ... (großer Fehler) ..aber es funktioniert ....

kann nicht garantiert werden .. So ist es besser (nicht besser), niemals Verweis auf Daten zurückgeben, die außerhalb des Gültigkeitsbereichs

Verwandte Themen