2012-05-23 7 views
5

Der Code ist wie folgt:Kann ich statische und automatische Variablen in C frei()?

#include <stdlib.h> 

int num = 3; // Static external variable 
int *ptr = &num; 

int main(void) 
{ 
int num2 = 4; // Automatic variable 
int *ptr2 = &num2; 

free(ptr); //Free static variable 
free(ptr2); //Free automatic variable 

return 0; 
} 

Ich versuche, den obigen Code zu kompilieren und es funktioniert, ich bin neugierig macht die free() Funktion der Lage, sowohl die statischen Variablen und auch automatische Variable zu befreien? Oder im Grunde tut es nichts?

+1

Es "funktioniert" für ausreichend niedrige Qualitätsdefinition von "funktioniert". Es kann auch auf dem gleichen System, dem gleichen Compiler oder verschiedenen Kompilierungsoptionen abstürzen. Es ist einfach ** undefiniertes Verhalten ** - alles kann passieren, sogar etwas erwartet. – Jens

Antwort

12

free() Aufruf auf einem Zeiger nicht durch Zuordnen von Speicher Funktionen zurückgegeben (malloc, calloc usw.) verursacht undefiniertes Verhalten.
Ihr Code hat ein undefiniertes Verhalten. Der Compiler muss Ihnen also keine Diagnose geben und kann jegliches Verhalten anzeigen, es könnte funktionieren oder abstürzen oder buchstäblich irgendetwas tun.

Vermeiden Sie es einfach, Code zu schreiben, der ein Undefined Behavior verursacht, ist die einzige Lösung.

+0

Sie können auch free() für einen NULL-Zeiger aufrufen, da dies das definierte Verhalten ist. Stellen Sie nur sicher, dass Sie nie kostenlos() zweimal auf dem * gleichen * Zeiger aufrufen. –

+0

wie wenn ich versuche, zweimal zu befreien ?? – caramel1995

+0

@ caramel23: Alles, was Sie erhalten können, ist ein Undefined Behavior. –

5

Sie sollten das nicht tun. free wird nur für Speicher verwendet, der dynamisch von Heap nach malloc Familie von Funktionen zugewiesen wird.

Speicher für num ist im Datensegment statisch belegt und kann nicht freigegeben werden. Speicher für num2 ist in der main Call-Stack-Frame zugewiesen und wird freigegeben, sobald main zurückgibt.

Was tatsächlich passiert, hängt von der Implementierung von free ab. Normalerweise werden bestimmte Datenstrukturen im Heap verwaltet, um die zugewiesenen und freien Speicherbereiche zu verfolgen. free erwartet, dass sich diese Datenstrukturen irgendwo an der Stelle befinden, auf die das Argument verweist. Wenn Sie einen Zeiger übergeben, der nicht auf einen malloc -allokierten Heap-Bereich zeigt, betrachtet er die Daten als nützliche Informationen und macht einige seltsame Dinge. Und du hast Glück, wenn das Ergebnis nur ein sofortiger Programmabsturz ist.