2016-07-31 26 views
-1

In den folgenden Beispielen zeigt Dereferenzierung zum Zeitpunkt der Wertzuweisung keinen Fehler mit malloc, Wie kommt es?Warum verhält sich Dereferenzierung bei malloc anders?

#include <stdio.h> 
#include <stdlib.h> 

int main() { 
    int *p; 
    printf("%d", &p); 
    int a = 10; 
    *p = a; 
    printf("%d", *p); 
    free(p); 
    return 0; 
} 

without malloc

#include <stdio.h> 
#include <stdlib.h> 

int main() { 
    int *p = (int*)malloc(sizeof(int)); 
    printf("%d", &p); 
    int a = 10; 
    *p = a; 
    printf("%d", *p); 
    free(p); 
    return 0; 
} 

with malloc

+0

bitte helfen, ich bin wirklich verwirrt in Zeiger – harry

+0

Bitte formatieren Sie Code, indem Sie die Zeile mit 4 Leerzeichen. Achten Sie auch darauf, den Code korrekt zu formatieren, damit er leicht zu folgen ist. Ich habe bei meinen Änderungen einen Passierschein gemacht, aber Sie könnten überprüfen, ob ich etwas verpasst habe. – jaydel

+0

Bitte schreibe nicht im Titel –

Antwort

4

In dem ersten Beispiel ist nicht initialisierten p. Die Dereferenzierung ihres Werts mit *p ruft undefiniertes Verhalten auf.

Im zweiten Beispiel ist p ein Zeiger zugewiesen, der von malloc() zurückgegeben wird. Entweder ist NULL und Dereferenzierung ruft Undefinierte Verhalten auf oder enthält eine gültige Adresse für einen Speicherblock groß genug, um eine int zu speichern und für jeden Typ richtig ausgerichtet. So wird Dereferenzieren zum Speichern des Werts a definiert, und der zweite printf wird 10 drucken.

Was die erste printf in beiden Fällen druckt, ist undefiniert. Die Adresse &p ist kein richtiger Typ für das Format %d, das Verhalten ist nicht definiert.

Sie könnten diesen Code beheben, indem Sie ihn in printf("%p\n", (void*)&p); ändern, aber es würde die Adresse der lokalen Variablen p ausgeben.

Sie beabsichtigen wahrscheinlich printf("%p\n", (void*)p); zu schreiben, die die tatsächliche Adresse in p enthalten drucken würden, aber dies würde auch nicht definiertes Verhalten im ersten Fall berufen, weil p nicht initialisiert ist und eine Trap-Darstellung enthalten könnte.

+0

Informationen zum Drucken von Zeigerwerten: http://stackoverflow.com/documentation/c/3750/formatted-input-output/12982/printing-the-value-of-a-pointer-to-an- object#t= 201607311741210873583 – alk

+0

@harry: Wenn diese Antwort nützlich ist, können Sie sie akzeptieren, indem Sie auf das graue Häkchen unter der Antwortpunktzahl klicken. – chqrlie