• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Tworzenie dynamiczne tablicy wielowymiarowej

Object Storage Arubacloud
0 głosów
379 wizyt
pytanie zadane 23 maja 2017 w C i C++ przez AndekQR Użytkownik (880 p.)

Witam

Mam taki oto kod:

    szachownica = (int**)malloc(size*sizeof(int*));
    for(i=0; i<size; i++)
        szachownica[i] = (int*)malloc(size*sizeof(int));

Jest ktoś w stanie wyjaśnić znak po znaku, słowo po słowie co tu się dzieje? 

Dlaczego w pierwszym nawiasie pierwszego wierszu jest (int**)? Według mnie jest to rzutowanie tylko czemu są tam dwa asteryksy? Dlaczego sizeof(int*), anie po prostu sizeof(int) tak jak jest w 3 wierszu?

 

1 odpowiedź

+1 głos
odpowiedź 23 maja 2017 przez tangarr Mędrzec (154,860 p.)
wybrane 23 maja 2017 przez AndekQR
 
Najlepsza

Macierz (tablica dwuwymiarowa) to tak naprawdę tablica tablic.
W języku C tablice reprezentuje się poprzez wskaźnik na odpowiedni typ (int*, char*, MÓJ_TYP*).
Aby utworzyć tablicę dwuwymiarową musisz utworzyć tablicę wskazującą na tablice jednowymiarowe.
Stąd się bierze dodatkowa gwiazdka*.
Dla tablicy trójwymiarowej musiałbyś dodać kolejną gwiazdkę.
 

int x = 5, y= 10; z=20;
int ***tablica = (int***)malloc(x*sizeof(int**));
for (int i=0; i<x; i++) {
    tablica[i] = (int**)malloc(y*sizeof(int*));
    for (int j=0; j<y; j++) {
        tablica[i][j] = (int*)malloc(z*sizeof(int));
        for (int k=0; k<z;k++)
            tablica[i][j][k]=0;
    }
}

Funkcja malloc służy do alokacji ciągłego bloku pamięci.
Malloc zwraca surowy wskaźnik (void*) dlatego należy rzutować go na odpowiedni typ.
Funkcja alokuje dokładnie tyle bajtów pamięci, ile zostanie przekazane w parametrze. Zawsze musisz podać odpowiedni rozmiar dla twojej tablicy. Wskaźnik (int*, int**, void*) ma zazwyczaj rozmiar zgodny z architekturą (32 lub 64 bity). Typ int musi mieć rozmiar co najmniej 16bitów (standardowo ma 32), ale jego rozmiar może być różny w zależności od implementacji.

komentarz 23 maja 2017 przez AndekQR Użytkownik (880 p.)
Trochę już mi się rozjaśniło. A jak wygląda dealokacja pamięci tej tablicy? Podejrzewam że samo free(szachownica) nie wystarczy.
komentarz 23 maja 2017 przez tangarr Mędrzec (154,860 p.)

Dla każdego malloca musisz wywołać free.
 

for (int i=0; i<x; i++) {
    for (int j=0; j<y; j++) {
        free(tablica[i][j]);        
    }
    free(tablica[i]);
}
free(tablica);

 

Podobne pytania

0 głosów
0 odpowiedzi 104 wizyt
pytanie zadane 18 stycznia 2018 w C i C++ przez AnastaZIuk Początkujący (330 p.)
0 głosów
1 odpowiedź 108 wizyt
pytanie zadane 13 czerwca 2018 w JavaScript przez kenjiro244 Dyskutant (8,600 p.)
+1 głos
1 odpowiedź 351 wizyt

92,573 zapytań

141,423 odpowiedzi

319,645 komentarzy

61,959 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...