2016-08-10 1 views
-3

Mit folgendem CodeWarum gcc nicht 0 consistenly

#include <stdio.h> 

int main() { 

    int num; 
    printf("%d\n", num); 

    int* num2; 
    printf("%p\n", &num2); 

    return 0; 
} 

nach einer Erklärung int gedruckt wurde bekam ich zur Folge haben wie:

enter image description here

Von Memory allocation for global and local variables, ich die globale Variable kennen num wird implizit auf 0 initialisiert, sogar wird es von mir nicht initialisiert.

Jetzt bin ich gerade etwas zufällig versucht, so dass ich ändern Sie den Code zu

#include <stdio.h> 

int main() { 

    int num; 
    printf("%d\n", num); 

    int* num2; 
    printf("%p\n", num2); 

    return 0; 
} 

und jetzt bekomme ich

enter image description here

Frage: Ich weiß nicht, warum der Wert von num ist nicht mehr 0.

Meiner Meinung nach, was ich mache mit der Variablen num2 und ihren Wert hat NICHTS MIT der Variablen num zu tun.

Ich bin nicht nur daran interessiert, warum, sondern möchte auch Ihre Meinungen über dieses Verhalten zu hören.

Antwort

3
int num; 
printf("%d\n", num); 

int* num2; 
printf("%p\n", num2); 

In beiden Fällen oberhalb von Werten von nicht initialisierten Variablen lesen (in einem Fall diese Variable einfache ganze Zahl ist, in anderen Fällen pointer - aber wie ich ihre Werte in beiden Fällen die nicht initialisiert werden).

Lokale Variablen werden standardmäßig nicht initialisiert.

Lesen von Werten nicht initialisierter Variablen ist undefined behavior.

Dies war in Ordnung

int* num2; 
printf("%p\n", &num2); 

weil &num Adresse num Zeiger - es Wert definiert hat. Obwohl mehr richtig zu bedienen ist: zu

printf("%p\n", (void*) &num2); 

In anderen Fällen, in denen Sie %p verwenden.

+0

'Das Lesen von Werten nicht initialisierter Variablen ist ein nicht definiertes Verhalten.' Nein; Nur wenn sie Trap-Repräsentationen enthalten können, z. B. Floats. Sie könnten jedoch undefinierte * Ergebnisse * erhalten. – wildplasser

+1

@wildplasser hm Ich denke auf SO lesen Werte von nicht initialisierten Variablen wird allgemein als UB bezeichnet: http://stackoverflow.com/documentation/c/364/undefined-behavior/2576/reading-an-uninitialized-object-that-is -nicht-backed-by-memory # t = 201608101257444574981 –

+0

Dereferenzieren eines Zeigers! = Lesen einer Variablen. – wildplasser

1

local Variablen ohne static Schlüsselwort haben automatic Speicherdauer. num ist eine solche Variable.

Und lesen Sie einen Wert einer Varibale mit automatic Speicher vor zuweisen einen beliebigen Wert kann dazu führen, alles. Sie können also keine bestimmte Ausgabe erwarten.

Und ja, wie Ihr Code ist, was Sie mit der Variablen num2 tun und ihr Wert hat nichts mit der Variablen num zu tun.Aber num2 und num können relaed werden, wenn Sie num2 = &num; tun, nach dem, was Sie zu *num2 zuweisen wird den Wert von num auswirken.

Verwandte Themen