39065

39065



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.



Wyszukiwarka

Podobne podstrony:
190 DODATEK C. WY BR AS E FUNKCJE BIBLIOTEKI STANDARDOWEJPrzykład •include <assert.h> int
102 DODATEK C. WY BR AS E FUNKCJE BIBLIOTEKI STANDARDOWEJ ispunct sprawdza czy znak jest znakiem prz
108 DODATEK C. WY BR AS E FUNKCJE BIBLIOTEKI STANDARDOWEJWartość zwracana Jeżeli funkcjo zakończą si
196DODATEK C. WY BU AS E FUNKCJE BIBLIOTEKI STANDARDOWEJ •    określenie formatu. Jeż
200DODATEK C. WY BU AS E FUNKCJE BIBLIOTEKI STANDARDOWEJ str tablica znaków, z której mają być odczy
Dodatek CWybrane funkcje biblioteki standardowejassertDeklaracja •define assert(expr)Plik
96 ROZDZIAŁ 13. BIBLIOTEKA STANDARDOWAGdzie są funkcje z biblioteki standardowej? Pisząc program w j
ANSI C 7 1 ELEMENTARZ Model wprowadzania i wyprowadzania danych, realizowany przez funkcje z bibli
SDC11583 Łańcuchy - <string.h> Funkcje z biblioteki standardowej operujące na łańcuchach
ANSI C 2 DODATEK B BIBLIOTEKA STANDARDOWA Tablica B-1. Przekształcenia funkcji printf Znak Typ
ANSI C 3 DODATEK B BIBLIOTEKA STANDARDOWA Tablica B-2. Przekształcenia funkcji scanf Znak Dana
ANSI C 7 DODATEK B BIBLIOTEKA STANDARDOWA double strtod(const char *s, char **endp) Funkcja strtod
ANSI C 8 DODATEK B BIBLIOTEKA STANDARDOWA ________ char *getenv(const char *name) Funkcja getenv z
ANSI C 0 DODATEK B BIBLIOTEKA STANDARDOWA____ clock_t clock(void) Funkcja clock zwraca czas proces
ANSI C 6 4 FUNKCJE I STRUKTURA PROGRAMU_________._—---- W bibliotece standardowej występuje funkcj
ANSI C 0 DODATEK B BIBLIOTEKA STANDARDOWA DODATEK B BIBLIOTEKA STANDARDOWAWejście i wyjście: nagłó
ANSI C 1 DODATEK B BIBLIOTEKA STANDARDOWA cznej tablicy. Wywołanie tmpnam(s) wstawia tę nazwę do a
ANSI C 4 DODATEK B BIBLIOTEKA STANDARDOWA czytaniu ze strumienia. Dla każdego strumienia można wyc

więcej podobnych podstron