C/Wskaźniki - więcej: Różnice pomiędzy wersjami
Usunięta treść Dodana treść
Po pierwsze: Użyty sposób jest w dalszej części odradzany, po drugie: edytowany jest fragment pamięci nie należący co tablicy, a znajdujący się tuż za nią. |
Podana była tylko symulacja tablicy dwuwymiarowej + drobne poprawki. |
||
Linia 222:
int ROZMIAR;
printf("Podaj rozmiar tabliczki mnozenia: ");
scanf("%d", ROZMIAR);
int **tabliczka = (int **)malloc(ROZMIAR * sizeof *tabliczka); {
}
/* tutaj można pętlą/funkcjami operującymi na pamięci zainicjować tabliczkę mnożenia */
free(*tabliczka);
free(tabliczka);
tabliczka = NULL;
</source>
Linia 235 ⟶ 239:
<source lang="C">
free(*tabliczka);
free(tabliczka);
</source>
Należy nie pomylić kolejności. Gdybyśmy najpierw pozbyli się wskaźnika na wskaźniki, a dopiero potem pozbyli się poszczególnych wskaźników na tablice, program będzie próbował odwołać się do pamięci, która nie była mu przydzielona.
Możemy również symulować tablicę dwuwymiarową za pomocą tablicy jednowymiarowej:
<source lang="c">
int
▲ *tabliczka = malloc(ROZMIAR * ROZMIAR * sizeof **tabliczka); /* 2 */
</source>
W tym przypadku alokujemy pamięć równą liczbie elementów tablicy dwuwymiarowej, jednak w tablicy jednowymiarowej. W ten sposób wszystkie elementy tablicy znajdą się w pamięci obok siebie, jednak utrudnia to dostęp do nich, a także operacje na nich (potrzebna jest do tego [[#Arytmetyka wskaźników|Arytmetyka wskaźników]]).
Zauważmy, że w ten sposób możemy uzyskać nie tylko normalną, "kwadratową" tablicę (dla dwóch wymiarów). Możliwe jest np. uzyskanie tablicy trójkątnej:
|