Kurs programowania w C cz. 172

Nasza ocena:

5
Wyświetleń: 560
Komentarze: 0
Notatek.pl

Pobierz ten dokument za darmo

Podgląd dokumentu
Kurs programowania w C cz. 172 - strona 1

Fragment notatki:

194 DODATEK C. WYBRANE FUNKCJE BIBLIOTEKI STANDARDOWEJ /* Przydzielenie początkowego bloku pamięci */ size = 64; tab = malloc(size * sizeof *tab); if (!tab) { perror("malloc"); return EXIT_FAILURE; } /* Odczyt liczb */ while (scanf("%f", &tmp)==1) { /* Jeżeli zapełniono całą tablicę, trzeba ją zwiększyć */ if (num==size) { float *ptr = realloc(tab, (size *= 2) * sizeof *ptr); if (!ptr) { free(tab); perror("realloc"); return EXIT_FAILURE; } tab = ptr; } tab[num++] = tmp; } /* Wypisanie w odwrotnej kolejnosci */ while (num) { printf("%f\n", tab[--num]); } /* Zwolnienie pamieci i zakonczenie programu */ free(tab); return EXIT_SUCCESS; } Uwagi Użycie rzutowania przy wywołaniach funkcji malloc, 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.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. sizeof *tablica), a nie typem (np. sizeof float) ułatwia późniejszą modyfikację programów. Gdyby w pewnym momencie pro- gramista zdecydował się zmienić tablicę z tablicy floatów na tablice double’i, musiałby wyszu- kiwać wszystkie wywołania funkcji malloc, realloc i calloc, co nie jest konieczne przy użyciu operatora sizeof z wyrażeniem. Warto zauważyć, że w przypadku standardowych konfiguracji systemu GNU/Linux funk- cje przydzielające pamięć nigdy nie zawodzą i nie zwracają wartości NULL (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 NULL albo jej równy, zwykłe sprawdzanie poprawności wywołania poprzez przy- równanie zwróconej wartości do zera może nie dać prawidłowego wyniku. ... zobacz całą notatkę



Komentarze użytkowników (0)

Zaloguj się, aby dodać komentarz