2016-04-07 12 views
-2

Ich untersuche die Funktionsweise einer automatischen Variablen. Ich weiß, dass es nur innerhalb des Blocks oder der Funktion, in der es deklariert ist, zugänglich ist und seine Lebensdauer innerhalb derselben Funktion oder desselben Blocks liegt. Also das folgende Stück Code versuche ich zu überprüfen.Verwendung der automatischen Variablen außerhalb ihres Bereichs in C

/Erklärung Header-Dateien/

void testfn(void); 
int *p; 
int main(void) 
{ 
    testfn(); 
    print("%d\n",*p); 
    return 0; 
} 

void testfn(void) 
{ 
    int x=444; 
    p=&x; 
} 

Der Ausgang ist - 444

Ich wundere mich, dass, wenn die testfn(); beendet, wird die Variable x zerstört. Dann wie in der Hauptfunktion der Zeiger (* p) druckt 444. Wie das funktioniert ... oder wenn mir etwas fehlt. Bitte klären Sie meine Zweifel.

Dank

+0

undefined Verhalten ... – dandan78

+0

Das ist die Sache mit undefiniertem Verhalten: Es kann wie das erwartete Verhalten aussehen, wenn es tatsächlich nicht ist.Es ist undefiniert, leider kein falsches Verhalten definiert. –

+1

Die Adresse hat den gleichen Wert, den sie hatte, als die Funktion aktiv war, aber der Speicher, auf den sie zeigt, ist dieser Funktion nicht mehr zugeordnet. Aber das ist alles eine echte Zeitverschwendung. Ich weiß, dass du versuchst zu lernen, aber das solltest du hier nicht veröffentlichen. –

Antwort

1

Der Speicherplatz, der zuvor für variable x reserviert wurde, ist noch nicht überschrieben. Aber es kann jederzeit sein. Aus diesem Grund führt Ihr Code zu undefiniertem Verhalten. Im folgenden Beispiel wird der Speicherplatz, der zuvor für die Variable x reserviert war, durch den Wert überschrieben, der der Variablen y zugewiesen ist. Da der Zeiger noch p an dieser Stelle zeigt, wird *p auf diesen neuen Wert bewerten:

#include <stdio.h> 

int *p; 

void test1(void) { 
    int x = 444; 
    p = &x; 
} 

void test2() { 
    int y = 15; 
} 

int main(void) { 
    test1(); 
    test2(); 
    printf("%d\n",*p); 
    return 0; 
} 
0

Es Zufall, dass nach wie vor bleibt der ursprüngliche Wert ist. Bei einem anderen Compiler oder einer anderen Kompilierungskonfiguration könnte es einen anderen Wert annehmen oder das Programm könnte einfach abstürzen.

Wenn Sie zwischen den Funktionen testfn und printf eine andere Funktion aufrufen, die etwas mit ihren lokalen Variablen macht, sehen Sie möglicherweise, dass der Wert 444 nicht mehr erhalten wird. Aber das ist wieder Zufall.

0

p verweist auf den Stapel, in dem x gespeichert wurde. Wenn der Speicherort für etwas anderes nicht verwendet wurde, erhalten Sie höchstwahrscheinlich 444.

versuchen Sie einen anderen Funktionsaufruf eingefügt werden, bevor p Druck und sehen, was passiert:

#include <stdio.h> 
#include <math.h> 

void foo() { 
    int y=123; 
} 

void testfn(void); 
int *p; 
int main(void) 
{ 
    testfn(); 
    foo(); 
    printf("%d\n",*p); 
    return 0; 
} 

void testfn(void) 
{ 
    int x=444; 
    p=&x; 
} 

Auf meinem Rechner ist der Ausgang jetzt:

123 

Da der Code führt zu undefinierten Verhalten, das Ergebnis könnte anders sein, wenn ich das auf einer anderen Plattform versuche. Aber Sie können sehen, dass undefiniertes Verhalten zu seltsamen Fehlern führen kann.

0

Die Tatsache, dass der Wert noch immer erhalten bleibt, ist völlig zufällig (nicht garantiert), weil noch nichts überschrieben wurde.

Sie können sich nicht darauf verlassen, es kann fehlschlagen, kann Müll drucken oder kann sogar Ihr Programm oder PC zum Absturz bringen.

Verwenden Sie dies nicht, es gilt als undefiniertes Verhalten.

Verwandte Themen