C/malloc: Różnice pomiędzy wersjami

Usunięta treść Dodana treść
→‎Przykład: dodane free()
Derbeth (dyskusja | edycje)
formatowanie, przecinki
Linia 37:
}
tablica[0] = 0.1;
 
free(tablica);
return 0;
Linia 44:
===Uwagi===
 
Użycie rzutowania przy wywołaniach funkcji malloc, [[C/realloc|realloc]] oraz [[C/calloc|calloc]] w języku C jest zbędne i szkodliwe. W przypadku braku deklaracji tych funkcji (np. gdy programista zapomni dodać plik nagłówkowy [[C/Biblioteka standardowa/Indeks tematyczny#stdlib.h|stdlib.h]]) kompilator przyjmuje domyślną deklaracje, w której funkcja zwraca int. Przy braku rzutowania spowoduje to błąd kompilacji (z powodu niemożności skonwertowania liczby na wskaźnik) co pozwoli na szybkie wychwycenie błędu w programie. Rzutowanie powoduje, że kompilator zostaje zmuszony do przeprowadzenia konwersji typów i nie wyświetla żadnych błędów. W przypadku języka [[C++]] rzutowanie jest konieczne.
 
Zastosowanie operatora sizeof z wyrażeniem (np. <tt>sizeof *tablica</tt>), a nie typem (np. <tt>sizeof float</tt>) ułatwia późniejszą modyfikację programów. Gdyby w pewnym momencie programista zdecydował się zmienić tablicę z tablicy floatów na tablice double'i, musiałby wyszukiwać wszystkie wywołania funkcji malloc, [[C/realloc|realloc]] i [[C/calloc|calloc]], co nie jest konieczne przy użyciu operatora sizeof z wyrażeniem.
 
Warto zauważyć, że w przypadku standardowych konfiguracji systemu GNU/Linux funkcje przydzielające pamięć nigdy nie zawodzą i nie zwracają wartości NULL (dla wartości parametru <tt>size</tt> większego od zera).
 
Ponieważ dla parametru <tt>size</tt> równego zero funkcja może zwrócić albo wskaźnik różny od wartości NULL albo jej równy, zwykłe sprawdzanie poprawności wywołania poprzez przyrównanie zwróconej wartości do zera może nie dać prawidłowego wyniku.
 
=== Zobacz też ===