1D4
DODATEK C. WY BR AS E FUNKCJE BIBLIOTEKI STANDARDOWEJ
/* Przydzielenie początkowego bloku panięci */ size ■ 64;
tab • malloc(size • sizeof *tab); if (!tab) {
perror("malloc"); return EXIT_FAILURE;
/• Odczyt liczb •/
while (scanf("Xf", fttmp)“*l) {
/• Jeżeli zapełniono całą tablicę, trzeba ją zwiększyć •/ if (num==size) {
float *ptr ■ realloc(tab, (size *= 2) • sizeof *ptr); if (!ptr) { iree(tab); perror("realloc"); return EXIT_FAILURE;
tab = ptr;
tab[nua++] ■ tmp;
/* Wypisanie w odwrotnej kolejności */ while (num) {
printf("Xf\n", tab[—num]);
/* Zwolnienie pamięci i zakończenie programu */ free(tab);
return EXIT_SUCCESS;
Uwagi
Użycie rzutowania przy wywołaniach funkcji nialloc, realloc oraz calloc w języku C jest zbędne i szkodliwe. W przypadku braku deklaracji tych funkcji (np. gdy programista zapomni dodać plik nagłówkowy stdlib.li) kompilator przyjmuje domyślną deklaracje, w której funkcja zwraca int. Przy braku rzutowania spowoduje to błąd kompilacji (z powodu niemożności skon wertowania 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. sizeof 'tablica), a nie typem (np. sizeof float) 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 nutlloc, realloc i calloc. co nie jest konieczne przy użyciu o|x*ratora sizeof z wyrażeniem.
Warto zauważyć, że w przytułku standardowych konfiguracji systemu GNU/Linux funkcje przydzielające pamięć nigdy nie zawodzą i nie zwracają wartości NULU (dla wartości parametru size większego od zera).
Ponieważ dla parametru size równego zero funkcja może zwrócić albo wskaźnik różny od wartości NULI, albo jej równy, zwykłe sprawdzanie poprawności wywołania poprzez przyrównanie zwróconej wurtości do zera może nie dać prawidłowego wyniku.