Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Pointer na struct vs. pointer na struct array

[es] :: C/C++ programiranje :: C/C++ za početnike :: Pointer na struct vs. pointer na struct array

[ Pregleda: 1978 | Odgovora: 4 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

aleksazr
zrenjanin

Član broj: 196784
Poruke: 245
*.aDSL.Verat.Net.



+11 Profil

icon Pointer na struct vs. pointer na struct array19.02.2013. u 23:23 - pre 135 meseci
Recimo da koristim standardnu strukturu RECT iz windowsa i koristim pointer na RECT.

Code:

RECT *prect;

// mogu da kažem
prect->left = 0;

// ali mogu i
prect[-1].left = 0;
prect[0].left  = 0;
prect[1].left  = 0;

i kompajler se neće buniti...

Šta sam ja definisao u prvoj liniji, pointer na jedan RECT ili na array RECTa?

Kako da definišem pointer na array, ako ne znam unapred koliko RECTa ima?

Inače, pitam jer ne mogu da nateram WinDbg (a ni MSVC debugger) da mi prikaže
ceo spisak RECT struktura, a ne samo prvi.

Hvala

[Ovu poruku je menjao aleksazr dana 20.02.2013. u 10:16 GMT+1]
CYRfree 2.0.5 - ako bi ćirilicu radije čitali kao latinicu.
Serbian Latin & Cyrillic keyboard layout 08.nov.2022 - za QWERTY tastature sa našeg tržišta.
http://users.beotel.net/~gwh/

 
Odgovor na temu

the_tosic

Član broj: 37314
Poruke: 381
82.208.217.*



+128 Profil

icon Re: Pointer na struct vs. pointer na struct array20.02.2013. u 19:15 - pre 135 meseci
To je pointerska aritmetika.
U principu to sto si napisao i ako je potpuno pogresno ce "raditi". Doduse verovatno ces dobiti segmentation faulth.

Da skratim, odgovor na tvoje pitanje je da u watch-u umesto prect stavis prect,10 (ili tako nesto) i videces 10 struktura, pocevsi od te adrese.

**********************************************************

Posto je C/C++ jezik relativno niskog nivoa. Moguce je da uradis takve stvari bez nekog exceptiona. I nemoguce je da na osnovu pokazivaca znas duzinu niza koji si alocirao ako si ga alocirao dinamicki;

Code (c):
//Recimo u tvom kodu su pogresne sledece stvari:
RECT *prect;
prect->left = nesto;
// ovim sto si napisao ti radis sledece:
//   pravis promenjivu koja je tipa pokazivac na RECT i koja je NEINICIJALIZOVANA (random) adresa x
//   na adresu x ti upisujes neku vrednost.
//   to znaci da ako adresa x pokazuje negde u tvoj kod, ti mozes da prepises svoj program, ako pokazuje recimo na neki deo tvog os-a obaras sistem
//   ovo iznad naravno zbog koriscenja virtuelnog memorijskog prostora nije tacno, pa najgore sto mozes da uradis je da spucas svoj program

// pravilno je:
RECT *prect = (RECT*) malloc(sizeof(RECT));
prect->left = nesto;
//ili
RECT rect;
RECT *prect= ▭
prect->left = nesto;
rect.left = nesto;

// Ako hoces da kreiras niz RECT-ova
int SIZE = 5;
RECT *prect = (RECT*) malloc(sizeof(RECT) * SIZE);
// onda npr sledece grupe izraza rade istu stvar
prect->left = nesto;
prect[0].left = nesto;

(prect + 1)->left = nesto;
prect[1].left = nesto;
(prect + 2)[-1].left = nesto;

// e i dok su gornji izrazi korektni jer gadjaju alociranu memoriju
// sledeca dva izraza su nekorektna jer gadjaju nealociranu memoriju
prect[-1].left = nesto;
(prect - 2)[0].left = nesto;


 


[Ovu poruku je menjao the_tosic dana 20.02.2013. u 20:33 GMT+1]
 
Odgovor na temu

aleksazr
zrenjanin

Član broj: 196784
Poruke: 245
*.aDSL.Verat.Net.



+11 Profil

icon Re: Pointer na struct vs. pointer na struct array20.02.2013. u 19:33 - pre 135 meseci
Da napomenem da program koji sam dao je samo primer, dakle inicijalizuje se sve kako treba u pravom programu.

prect,10 ne radi (ispisuje integer, 0n10)

CYRfree 2.0.5 - ako bi ćirilicu radije čitali kao latinicu.
Serbian Latin & Cyrillic keyboard layout 08.nov.2022 - za QWERTY tastature sa našeg tržišta.
http://users.beotel.net/~gwh/

 
Odgovor na temu

the_tosic

Član broj: 37314
Poruke: 381
82.208.217.*



+128 Profil

icon Re: Pointer na struct vs. pointer na struct array20.02.2013. u 20:00 - pre 135 meseci
Zaista nemam ideju, ja sam sad probao kod sebe kreirao sam niz nekih struktura i sa ptr,5 ih vidim
Code:
-        ptr,5    0x002f9260 {{a=1 b=0x008d5858 "12ss34" }, {a=2 b=0x008d5860 "1234da" }, {a=3 b=0x008d5868 "1234ad" }, ...}    S[5]
+        [0]    {a=1 b=0x008d5858 "12ss34" }    S
+        [1]    {a=2 b=0x008d5860 "1234da" }    S
+        [2]    {a=3 b=0x008d5868 "1234ad" }    S
+        [3]    {a=4 b=0x008d5870 "1asd234" }    S
+        [4]    {a=-842150451 b=0xcdcdcdcd <Error reading characters of string.> }    S

 
Odgovor na temu

Ivan Dimkovic

Administrator
Član broj: 13
Poruke: 16683
*.dip.t-dialin.net.



+7169 Profil

icon Re: Pointer na struct vs. pointer na struct array20.02.2013. u 20:31 - pre 135 meseci
Citat:
aleksazr
Šta sam ja definisao u prvoj liniji, pointer na jedan RECT ili na array RECTa?


Deklarisao si pointer na memorijsku lokaciju velicine sizeof(RECT) i jos mu nisi dodelio vrednost, sto znaci da je memorijska lokacija nedefinisana.

C kompajler pojma nema da li se na toj lokaciji nalazi jedan RECT ili pocetak niza od dva, pet ili milion RECT-ova, ili se ne nalazi ni jedan RECT posto je pointer u nedefinisanom stanju. Moderni kompajleri ce bar primetiti da pokusavas da referenciras pointer koji nije setovan zato sto u ovom trivijalnom slucaju to mogu da zakljuce.

Medjutim, C kompajler ce ti dozvoliti da adresiras niz RECT-ova u odnosu na memorijsku lokaciju bez obzira na to da li je zaista alocirana memorija ili ne.

Tu se krije ogromna moc ali i ogromna ranjivost C koda - ako znas sta radis, mozes programirati vrlo nisko, tik malo iznad nivoa asemblera. Ali ako ne znas sta radis, ceka te gomila krahova :)


DigiCortex (ex. SpikeFun) - Cortical Neural Network Simulator:
http://www.digicortex.net/node/1 Videos: http://www.digicortex.net/node/17 Gallery: http://www.digicortex.net/node/25
PowerMonkey - Redyce CPU Power Waste and gain performance! - https://github.com/psyq321/PowerMonkey
 
Odgovor na temu

[es] :: C/C++ programiranje :: C/C++ za početnike :: Pointer na struct vs. pointer na struct array

[ Pregleda: 1978 | Odgovora: 4 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.