Kezdőoldal » Számítástechnika » Programozás » C, pointer segítség?

C, pointer segítség?

Figyelt kérdés

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?



2023. júl. 8. 03:19
 1/4 anonim ***** válasza:
8%

for (int i = 0; i < 100; i++) {

   printf("%d ", i);

}

2023. júl. 8. 07:36
Hasznos számodra ez a válasz?
 2/4 anonim ***** válasza:
91%

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.

2023. júl. 8. 07:52
Hasznos számodra ez a válasz?
 3/4 A kérdező kommentje:
Nagyon szépen köszönöm, a magyarázatot főként!
2023. júl. 9. 02:20
 4/4 anonim ***** válasza:

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.

2023. júl. 15. 07:19
Hasznos számodra ez a válasz?

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

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!