[ Ivan Vasić @ 25.12.2003. 18:45 ] @
Ako je *pi pokazivac na integer-e i dodelim mu memoriju
pi=malloc(n*sizeof(int));

da li je moguce naci broj 'n' ako on nije poznat tj. pretpostavimo da imam taj *pi kome je dodeljena nepoznata velicina memorije i želim da znam koliko
integer-a on sadrži ->
onda bi taj broj našao kao n= (velicina*pi)/sizeof(int) . Jel moguce ovo ?
Ako jeste onda je pitanje kako da nadjem (velicina(*pi)) ??

Naravno uz pretpostavku da je pokazivacu regularno dodeljena memorija kao što sam gore naveo.
U pitanju je 'C'.
[ Dejan Lozanovic @ 25.12.2003. 19:59 ] @
ne broj 'n' nije moguce naci. jedina varijanta koja bi mogla da "prodje" da se radi o poracima tipa char. i da je poslednji znak '\0' tada bi nesto moglo da se proracuna mada i to je opet pitanje da li je to sve.
[ Ivan Dimkovic @ 25.12.2003. 20:20 ] @
Pa mozes da probas da citas sve pi++ sve dok ne uhvatis memory exception :) Nije bas pouzdano - ali moze da posluzi :)))

[ Reljam @ 25.12.2003. 20:28 ] @
Ako koristis Microsoftov CRT, pogledaj _msize funkciju. _msize vraca velicinu odredjenog memorijskog bloka:

Code:
size_t _msize(
   void *memblock 
);
[ milanche @ 25.12.2003. 22:32 ] @
Za programera pointer je jedna jedina promenljiva koja sadrzi adresu neke druge
memorijske lokacije.

Za kompajler, medjutim, pointer je uvek neka struktura (ili objekat) koja osim same
adrese mora da sadrzi i ostale vitalne podatke, kao sto su naprimer sizeof() tipa
na koji pointer pokazuje. Bez te informacije, kompajler ne bi mogao da obavi prostu
pointersku aritmetiku tipa ptr++ ili ptr+=2;

Posto je layout takvih struktura stvar odluke coveka koji pise kompajler, razni kompajleri imaju razne nacine kako vode knjigovodstvo vezano za pointere.

Ja konkretno znam da ti kazem kako se moze otkriti podatak koji trazis u VisualStudio okruzenju:

Ako pointer ptr trenutno sadrzi adresu 0x1234ABCD, onda se na adresi manjoj za
0x10 (u ovom slucaju 0x1234ABBD) nalazi int promenljiva koja sadrzi tacan broj
byte-ova dodeljenih pointeru prilikom dinamicke alokacije memorije.

Dakle:
int nKolikoBajtovaJeAlocirano = *((int*)((int)ptr - 0x10)); // u VisualStudio-u

Za druge kompajlere sacekaj priloge drugih posetilaca.
[ Reljam @ 25.12.2003. 23:12 ] @
milanche, to je domisljat ali vrlo los nacin da se ovo uradi iz prostog razloga sto to zavisi od verzije CRTa koju koristis. Mnogo je bolje da koristis _msize (vidi moj post gore), kada vec pricamo o Microsoftovim kompajlerima.
[ milanche @ 26.12.2003. 05:33 ] @
Relja,

hvala na ispravci. Pripremljen post mi je stajao par sati otkucan na masini pre nego
sto sam ga poslao, tako da nisam video tvoj post.
[ Ivan Vasić @ 26.12.2003. 11:34 ] @
Hvala na odgovorima ! Nešto od ovoga će sigurno da upali - probaću što pre.
[ Sundance @ 26.12.2003. 18:05 ] @
Pogledaj i HeapSize API na win32. Trebat ce ti i heap handle (u tvom slucaj od CRT), a njega mozes naci preko recimo handle viewera od sysinternalsa.
[ Dragi Tata @ 19.03.2004. 19:07 ] @
_msize (i HeapSize) lepo radi kad se memorija alocira sa malloc. Međutim, kad se koristi new[] ne radi. Zna li kogod kako da se vidi veličina bloka alociranog sa new[] ?