2012-05-23 26 views
5

Kod jest następująco:Czy mogę zwolnić() statyczne i automatyczne zmienne w C?

#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; 
} 

próbuję skompilować powyższy kod i to działa, jestem ciekawy sposób free() funkcja stanie uwolnić zarówno statyczną zmienną, a także zmienną automatyczną? Lub w zasadzie nic nie robi?

+1

"Działa" dla wystarczająco niskiej jakości definicji "prac". Może również zawieść, nawet w tym samym systemie, ten sam kompilator lub różne opcje kompilacji. To po prostu ** niezdefiniowane zachowanie ** - wszystko może się zdarzyć, nawet coś, czego się spodziewamy. – Jens

Odpowiedz

12

Wywołanie free() na wskaźnik nie zwróconej przez przydzielanie pamięci funkcji (malloc, calloc etc) powoduje zachowanie niezdefiniowane.
Twój kod ma niezdefiniowane zachowanie, więc kompilator nie musi podawać żadnych informacji diagnostycznych i może pokazać jakiekolwiek zachowanie, może działać, zawiesić się lub dosłownie zrobić cokolwiek.

Po prostu unikaj pisania kodu, który powoduje, że Undefined Behavior jest jedynym rozwiązaniem.

+0

Możesz także wywołać free() na wskaźniku NULL, ponieważ jest to zdefiniowane zachowanie. Upewnij się tylko, że nigdy nie wywołujesz funkcji free() dwukrotnie na * tym samym * wskaźniku. –

+0

jak mogę spróbować uwolnić dwa razy? – caramel1995

+0

@ caramel23: Wszystko, co możesz uzyskać, to niezdefiniowane zachowanie. –

5

Nie powinieneś tego robić. free jest używany tylko do pamięci dynamicznie przydzielanej z sterty przez rodzinę funkcji malloc.

Pamięć dla numeru num jest statycznie przydzielana w segmencie danych i nie można jej zwolnić. Pamięć do num2 jest przydzielana w ramce stosu wywołań main i zostanie zwolniona, gdy zwróci się main.

To, co się dzieje, zależy od wdrożenia: free. Zazwyczaj w sterty przechowywane są określone struktury danych, które pomagają śledzić przydzielone i wolne obszary pamięci. free oczekuje, że te struktury danych będą znajdować się gdzieś w miejscu, do którego odnosi się argument. Po przekazaniu go wskaźnikowi, który nie wskazuje na obszar sterty przydzielonej do klienta, traktuje dane o odpadach jako użyteczne informacje i robi dziwne rzeczy. I masz szczęście, jeśli wynikiem jest natychmiastowa awaria programu.

Powiązane problemy