C/Wskaźniki: Różnice pomiędzy wersjami

Usunięta treść Dodana treść
Lethern (dyskusja | edycje)
→‎Obsługa pamięci: czytelna poprawka (*tablica), poprawione dla pozostałych miejsc / int main jest tu całkowicie zbędny, w pozostałych fragmentach był też pominięty
Lethern (dyskusja | edycje)
Linia 234:
Rozważmy sytuację, gdy programista zapomni dodać plik nagłówkowy stdlib.h, wówczas kompilator (z braku deklaracji funkcji malloc) przyjmie, że zwraca ona typ int, zatem do zmiennej <tt>tablica</tt> (która jest wskaźnikiem) będzie przypisywana liczba całkowita, co od razu spowoduje błąd kompilacji (a przynajmniej ostrzeżenie), dzięki czemu będzie można szybko poprawić kod programu. Rzutowanie jest konieczne tylko w języku C++, gdzie konwersja z <tt>void*</tt> na inne typy wskaźnikowe nie jest domyślna, ale język ten oferuje nowe sposoby alokacji pamięci.
 
Teraz rozważmy sytuację, gdy zdecydujemy się zwiększyć dokładność obliczeń i zamiast typu float użyć typu double. Będziemy musieli wyszukać wszystkie wywołania funkcji malloc, calloc i realloc odnoszące się do naszej tablicy i zmieniać wszędzie <tt>sizeof(float)</tt> na <tt>sizeof(double)</tt>. Aby temu zapobiec lepiej od razu użyć <tt>sizeof(*tablica)</tt> (lub jeśli ktoś woli z nawiasami: <tt>sizeof(*tablica)</tt>), wówczas zmiana typu zmiennej <tt>tablica</tt> na <tt>double*</tt> zostanie od razu uwzględniona przy alokacji pamięci.
 
Dodatkowo, należy sprawdzić, czy funkcja malloc nie zwróciła wartości NULL - dzieje się tak, gdy zabrakło pamięci. Ale uwaga: może się tak stać również jeżeli jako argument funkcji podano zero.