C, pointer segítség?
Sziasztok!
Próbálom megérteni végre C-ben a pointerek használatát. Eljutottam odáig, hogy tömb bejárásakor pl. memóriamegtakarítás és gyorsaság előnye van, értem. Viszont sehogyan sem akaródzik a kódom működni és a szintaxis megértése, sok helyen sok mást olvasok róla.
Jelenleg itt tartok:
void tombbejaraspointerrel() {
int *tombpointer[100];
for(int i = 0; i < 100; i++) {
*tombpointer[i] = i;
}
for(int i = 0; i < 100; i++) {
printf("A tomb %d. szamjegye: %d, cime a memoriaban: %p\n", i, *tombpointer[i], &tombpointer[i]);
}
}
Igen, main függvényből hívom, eredetileg paraméterként kapta a tömböt, de végül egyszerűsítettem, hogy kizárjam a hibalehetőségeket.
Jelenleg mindegyik sorban azt kapom, hogy A tomb (1-99-ig megy ahogyan kell). szamjegye: 100(ez nem változik sehogyan sem), cime a memoriaban: 000000946b7ffa78(persze ez is változik)
Kaphatnék egy kis segítséget?
for (int i = 0; i < 100; i++) {
printf("%d ", i);
}
Az operátorok precedenciája miatt nem egészen az történik, amit te szeretnél. Zárójelezzük be a tömbdefiniálást, és meglátod:
int *(tombpointer[100]);
Ezt a fordító úgy értelmezi, hogy adj vissza egy _tömböt_, ami 100 db intre mutató pointerből áll.
Ha ezt írnád le, azzal létrehoznál egy _tömböt_, amely 100 db, intre mutató pointerekből áll. Így képzeld el: tombpointer = [int*][int*][int*]...
Mivel a [] precedenciája nagyobb ( [link] ), mint a * (indirekció) precendenciája, ezért ez a kettő kifejezés egyenértékű:
int *(tombpointer[100]);
int *tombpointer[100];
Tehát a te kódod épp ezt csinálja. Alapvetően ez is egy működő megoldás, de ebben az esetben _muszáj_ memóriát foglalnod minden egyes külön-külön elemeknek (hisz azok pointerek, a pointer pedig memóriaszemétra mutat egészen addig nem foglalsz neki memóriaterületet, vagy nem állítod be egy korábban már lefoglalt változó címére), tehát az első ciklusod valahogy így kell, hogy kinézzen:
for(int i = 0; i < 100; i++) {
tombpointer[i] = (int*) malloc(sizeof(int));
*tombpointer[i] = i;
}
Itt a teljes kód: [link]
De te valószínűleg nem ezt szeretnéd, mert ez rettentően anti-hatékony, mind sebesség, mind memóriafoglalás tekintetében. Te egy olyan mutatót szeretnél visszakapni, ami egy 100 db intekből álló tömbre mutat. Valami ilyesmit: tombpointer = *([int][int][int]...)
Ezt így kapod meg:
int (*tombpointer)[100];
Ezt a fordító úgy értelmezi, hogy adj vissza egy _mutatót_, ami egy 100 db int elemű tömbre mutat.
Ebben az esetben is kell memóriát foglalni, de az már egyszerű lesz:
tombpointer = malloc(sizeof(int)*100);
Itt egyszerűen lefoglalunk 100 db int méretének megfelelő, egybefüggő memóriaterületet, ahova már nyugodtan lehet írkálni az inteket.
A teljes kód: [link]
Namost azzal, hogy a függvény eredetileg paraméterként kapta a tömböt, te viszont beemelted a tömbmutatót a függvénybe, ezzel együtt elfelejtettél memóriát foglalni a tömbnek, és igazából ez a fő probléma a kóddal, ugyanis memóriafoglalás nélkül egy segmentation fault-ot (access violationt) csinálsz. Hogy nálad éppenséggel nem dobál segfaultot, az csak azért van, mert valószínűleg a programban valahol korábban már lefoglaltad azt a területet amire tombpointer mutat (és tele is írtad százasokkal, ezért kapsz mindig 100-at), és az oprendszered úgy tartja nyilván, hogy az a memóriaterület a programodhoz tartozik.
Van az egyetemi tananyagok/tárgyak között olyan, hogy számítógép architektúrák. Ezt azért oktatják, hogy a témához kötődő fogalmak (ilyen pl. a pointer is) mibenlétével, azok szerepével, működésével tisztában legyenek a hallgatók.
Valamit csak akkor tud valaki jól csinálni, ha azokkal a dolgokkal, amiket használ, a lehető legjobban tisztában van. Egyébként csak maszatolás, próbálkozás, silány munka, fércmű lesz az eredmény.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, 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!