122
ROZDZIAŁ 17. WSKAŹNIKI
Ostatnią funkcją jest funkcja ca!loc(). Przyjmuje ona dwa argumenty: liczbę elementów tablicy oraz wielkość pojedynczego elementu. Podstawową różnicą pomiędzy funkcjami mal-loc() i calloc() jest to, że ta druga zeruje wartość przydzielonej pamięci (do wszystkich bajtów wpisuje wartość 0).
Tablice wielowymiarowe
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
Rysunek 17.4: tablica dwuwymiarowa w rzeczywistości tablica ze wskaźnikami do tablic
W rozdziale Tablice pokazaliśmy, jak tworzyć tablice wielowymiarowe, gdy ich rozmiar jest znany w czasie kompilacji. Teraz zaprezentujemy, jak to wykonać za pomocą wskaźników i to w sytuacji, gdy rozmiar może się zmieniać. Załóżmy, że chcemy stworzyć tabliczkę mnożenia:
int rozmiar; int i;
int “tabliczka;
printf("Podaj rozmiar tabliczki mnożenia: ");
scanf("%i", ^rozmiar); /* dla prostoty nie będziemy sprawdzali,
czy użytkownik wpisał sensowną wartość •/
tabliczka ■ malloc(rozmiar * sizeof *tabliczka); /• 1 •/
for (i ■ 0; Krozmiar; ♦♦!) { /• 2 •/
tabliczka[i] = malloc(rozmień: * sizeof “tabliczka); /• 3 •/
} /• 4 •/
for (i - 0; i<rozmiar; ♦♦i) { int j;
for (j ■ 0; j<rozmiar; ♦♦j) { tabliczka[i][j] = (i+l)*(j+l);
>
Najpierw musimy przydzielić pamięć- najpierw dla "tablicy tablic" (1) a potem dla każdej z |x>dtahlic osobno (2-4). Ponieważ tablica jest typu int* to nasza tablica tablic l>ę-dzie wskaźnikiem na int* czyli int**. Podobnie osobno, ale w odwrotnej kolejności będziemy zwalniać tablicę wielowymiarową:
for (i = 0; icrozmiar; ++i) { free(tabliczka[i] );
free(tabliczka);
Należy nie pomylić kolejności: po wykonaniu free(tabliczka) nie będziemy mieli prawa odwoływać się do tabliczka [i] (lx> wcześniej dokonaliśmy zwolnienia tego obszaru pamięci).