2017-09-11 3 views
4

Im folgenden Programm zeigt ptr auf nicht initialisiert Variable x. Vor dem Drucken ptr, habe ich 10 zu ptr zugewiesen und es ausdrucken.Zeiger zeigt auf nicht initialisierte Variable

#include <stdio.h> 

int main() 
{ 
    int *ptr; 
    int x; 

    ptr = &x; 
    *ptr = 10; 

    printf(" x = %d\n", x); 
    printf(" *ptr = %d\n", *ptr); 
} 

Sowohl ptr und x Druck der richtige Wert. Aber ich habe Zweifel, Ist es definiert Verhalten?

+2

Bitte darüber lesen. Warum denkst du, es wäre definiert oder undefiniert? Wo sind Ihre Forschungsanstrengungen? Was hast du gefunden, was du nicht verstanden hast? Hinzufügen dieser macht es eine gute Frage, nichts für ungut. –

+0

Sie können nur potenziell schlecht definiertes Verhalten aufrufen, wenn Sie _ auf den Wert einer Variablen zugreifen, die nicht initialisiert wurde. – Lundin

+0

Könnten Sie bitte erklären, was Sie mit "Bevor dereferenzierte' ptr' gemeint habe, habe ich '10' zu' ptr' zugewiesen und es dereferenziert. " ? Zuweisen von '10' zu' * ptr' (nicht 'ptr' ist dereferenzierend. Sie dereferenzieren es, bevor Sie es dereferenzieren? – Gerhardh

Antwort

13

Ja, ist es. Sie weisen ptr einen gültigen Wert zu und verwenden dann Indirection, um x einen gültigen Wert zuzuweisen.

Die Adresse einer Variablen wie x und ihr Wert sind separate Dinge. Nachdem der Speicher zugewiesen wurde, ist die Adresse immer eindeutig definiert, unabhängig vom Wert in der Variablen.

+1

(obwohl der Compiler diese * noch optimieren kann, als ob *, wie der Zeiger nirgends herumgereicht wird) –

+1

@ AnttiHaapala - Ja, natürlich, das Verhalten des Codes bleibt jedoch in beiden Richtungen definiert. – StoryTeller

1

Nach meinem Verständnis ist es Verhalten definiert, da es nicht notwendig ist, Speicher vor dem Schreiben zu initialisieren.

1

Ja, denn wenn Sie x deklarieren, wird der Platzhalter/Speicher für Sie verfügbar .

ptr = &x; *ptr = 10; Code effektiv bedeutet

x =10

Verwandte Themen