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ą.
Bartem (dyskusja | edycje)
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); /* 1 */
*tabliczkafor(int i=0; malloc(i<ROZMIAR; ++i) * ROZMIAR * sizeof **tabliczka); /* 2 */
{
*(tabliczka +i)= malloc(ROZMIARint * )malloc(ROZMIAR * sizeof **tabliczka); /* 2 */
}
/* tutaj można pętlą/funkcjami operującymi na pamięci zainicjować tabliczkę mnożenia */
free(*tabliczka); /* 5 */
free(tabliczka); /* 6 */
tabliczka = NULL; /* 7 */
</source>
Linia 235 ⟶ 239:
 
<source lang="C">
free(*tabliczka); /* 5 */
free(tabliczka); /* 6 */
</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:
Jeśli chodzi o linie:
<source lang="c">
int **tabliczka = (int *)malloc(ROZMIAR * ROZMIAR * sizeof *tabliczka); /* 1 */
*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]]).
to linie te alokują pamięć. Najczęstszą konstrukcją są dwa alokowania pamięci: najpierw do wskaźnika <code>int **</code> przypisujemy bajty zaalokowane w pamięci o ilości <code>ROZMIAR * sizeof **tabliczka</code>. Jest to już ci znane, znacznie ciekawsza jest druga alokacja pamięci. Różni się ona od pierwszej tym, że przekazujemy jako ilość elementów '''kwadrat''' rozmiaru tablicy: <code>ROZMIAR * ROZMIAR</code>.
 
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: