Hogyan kell többdimenziós tombot dinamikusan foglalni C-ben?
Ugyanúgy, mint egydimenziósat. A foglalásnál csak adott bájtot kérsz, azt a kezelésénél választod csak szét. Azonban a fordító nem tudná, hogy mennyi egy sor hossza, így nem tudná pointer-aritmetikával kiszámolni.
Tehát ha ilyet szeretnél, hogy
int tomb[5][10] dinamikusan, akkor például
int **tomb = (int**)malloc(5*10*sizeof(int)); lehetne, de ez így nem jó.
Megoldás: Két külön típusú tömbbel foglalkozunk, és összerakunk egy tömbök tömbjét. Ez a gyakorlatban azt jelenti, hogy az első dimenzió (azaz az oszlop paraméter, ha grafikusan gondolkozunk) az csak pointereket tárol, amik szintén dinamikusan foglalt egydimenziós tömbre mutatnak.
Így az történik, hogy foglalunk egy akkora tömböt, ahány oszlopot szeretnénk, és ebbe a tömbbe nem értékeket, hanem tömbre mutató pointereket pakolunk. Így az 5*10-es példánál maradva lesz egy 5 méretű int* tömb, ami int*-ra mutató pointereket tárol. Azok a pointerek pedig egy int-eket tartalmazó tömb lesz. Így lesz 5 darab 10 méretű tömb, ami úgy viselkedik, mint egy kétdimenziós tömb.
Kód szinten:
int **tomb= (int**)malloc(5*sizeof(int*));
for(int i=0; i<5; i++){
tomb[i] = (int*)malloc(10*sizeof(int));
}
És ekkor ezt lehet így használni a pointer aritmetika miatt, mert tudja, mekkora egy sor:
tomb[2][1]=8;
FIGYELEM! Felszabadításnál, mivel töb dimenziós tömb van, először egy for ciklussal az összes belső tömböt fel kell szabadítani!!
Ugyanígy, csak int helyett char.
Használatnál meg azt a pointert adod át, amit kell.
Például printf:
printf("%s", tomb[3]);
másolás:
strcpy(tomb[1], tomb[4]);
És így tovább, és így tovább...
Kapcsolódó kérdések:
Minden jog fenntartva © 2025, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!