Warum ist mein Zeiger nach dem Freigeben nicht null?

8
%Vor%

Warum ist die Ausgabe dieses Programms nicht NULL?

    
Jeegar Patel 30.09.2011, 09:54
quelle

5 Antworten

17

Weil der Zeiger nach Wert in Ihre Funktion kopiert wird. Sie weisen NULL der lokalen Kopie der Variablen ( ptr ) zu. Dies weist es nicht der ursprünglichen Kopie zu.

Der Speicher wird weiterhin freigegeben, sodass Sie nicht mehr sicher darauf zugreifen können, aber Ihr ursprünglicher Zeiger ist nicht NULL .

Dies ist genauso, als würden Sie stattdessen int an eine Funktion übergeben. Sie würden nicht erwarten, dass das ursprüngliche int von dieser Funktion bearbeitet wird, es sei denn, Sie übergeben einen Zeiger darauf.

%Vor%

Wenn Sie den ursprünglichen Zeiger auf Null setzen möchten, müssen Sie einen Zeiger auf Zeiger übergeben:

%Vor%     
Merlyn Morgan-Graham 30.09.2011, 10:00
quelle
7

Weil die Funktion getFree() eine Kopie des Zeigers benötigt. ptr und c sind beide Zeiger, aber sie sind unterschiedliche Variablen. Aus demselben Grund gibt diese Funktion "6" aus:

%Vor%     
Vilx- 30.09.2011 09:59
quelle
4

Sie übergeben den Zeiger a nach Wert, so dass er nicht durch die Funktion geändert wird. Es ist nur eine Kopie des in der Funktion geänderten Zeigers, der ursprüngliche Variablenwert ist nicht betroffen.

Aktualisierung:

Wenn Sie Ihr Leben einfacher machen möchten, indem Sie das Freigeben + Nullen einer Variablen durch eine einzelne Codezeile ersetzen, benötigen Sie entweder ein Makro:

%Vor%

oder eine Funktion mit Zeiger auf Zeigerargument:

%Vor%     
Roman R. 30.09.2011 09:56
quelle
3

Zeiger werden als ganze Zahlen irgendwo im Speicher gespeichert.

Wenn Sie a = malloc(10); , a einen Wert haben, sagen Sie 0x1.

Wenn Sie getFree(a); aufrufen, kopiert die Funktion a in void *ptr .

Jetzt a=0x1 und ptr=0x1 .

Wenn Sie ptr=NULL ausführen, wird nur ptr zu NULL geändert, aber a ist immer noch 0x1 ..

    
wormsparty 30.09.2011 10:00
quelle
1

Sie übergeben den Zeiger nach Wert .. (Standardmäßig übergibt C das Argument nach Wert), was bedeutet, dass Sie nur die Kopie aktualisieren .. nicht die tatsächliche Position .. dafür müssen Sie möglicherweise Zeiger auf Zeiger in C verwenden

%Vor%     
Aman Agarwal 30.09.2011 09:57
quelle

Tags und Links