[ Ivan Vasić @ 05.01.2004. 15:23 ] @
Da li je moguce 'vise' puta uraditi
realloc(Niz,n*sizeof(int)) //(Niz je *Niz, Niz=(int*)malloc(sizeof(int))

jer mi treba TACNA memorija onoliko koliko niz treba da ima clanova a taj broj nalazim kasnije.
I uzgred nije moguce dodeliti veliku memoriju na pocetku pa na kraju uraditi realloc.

Moja for petlja izgleda ovako
Code:
for(i=0; i<1 ;i++)
    {
        realloc(Niz,(i+1)*sizeof(int));
        
    }

i prolazi PRVI put ali sledeci put kompajler prijavi gresku. Probao sam i "rucno" bez FOR prvi put
odradi realloc a drugi put rikne...
[ Reljam @ 05.01.2004. 16:24 ] @
Nemoj da koristis realloc - u zavisnosti od implementacije, on moze da prestane da radi mnogo pre nego sto to uradi malloc. Realloc moze da bude osetljiviji na fragmentaciju memorije od malloca. Najsigurniji nacin je da koristis malloc, memmove, i free za stari blok. Naravno, ako ne ocekujes da ce tvoj program raditi u situaciji gde je memorija ekstremno preopterecena ovo nema veze. Takodje nema veze ako CRT koj koristis interno odradi (malloc, memmove i free) ako ne moze da prosiri postojaci blok.

A inace, realloc vraca pointer na novi blok, tako da bi verovatno trebao da uradis:

Niz = realloc (Niz, ... );
[ NastyBoy @ 05.01.2004. 17:03 ] @
Realloc ti je veoma chudna zverka ;)
Pravio sam par memory-manager-a do sada i realloc() je uvek PITA! Ako (uglavnom zbog optimizacije, a i ReljaM-ovog saveta, jel ;) pokushash da implementirash svoju verziju, obavezno pogledaj u MSDN-u shta se tachno zbiva u realloc-u!!! Uglavnom, realloc i radi malloc-memmove-free ako ne nadje da je susedni blok u memoriji dovoljno veliki za novu vrednost!
Kako bilo, sumnjam da ti je realloc() najbolje resenje! To SIGURNO moze da se reshi na drugi nachin, koriscenjem nekog schratch-pad-a ili alociranjem memorije "na parchice"... Ako nishta drugo, mozda da dash konkretan problem pa da nadjemo reshenje za alokaciju ...

[ Goran Rakić @ 05.01.2004. 17:44 ] @
Niz = realloc(Niz...

Ispravka: U medjuvremenu si dobio odgovor.

A zašto realloc nije ok? mislim šta fali u njegovom korišćenju (sa implementacijom malloc, memcpy, free), zašto bi trebalo tražiti drugi način realizacije?
[ Ivan Vasić @ 05.01.2004. 21:44 ] @
E, ljudi hvala...

Upalilo je Niz=realloc(Niz....
nije mi palo na pamet da to moze da zeza...
[ Mikky @ 05.01.2004. 23:48 ] @
A kakva je situacija sa win32 API HeapRealloc, da li i ona ima nekih problema odnosno da li bi bilo bolje da manualno radim relokaciju i povecavanje memorije umesto sa ovom fjom?
[ NastyBoy @ 06.01.2004. 01:11 ] @
Citat:
A zašto realloc nije ok? mislim šta fali u njegovom korišćenju (sa implementacijom malloc, memcpy, free), zašto bi trebalo tražiti drugi način realizacije?


Tu nema generalnog odgovora, mada je pomenuta fragmentacija memorije.
Zavisi kakav softver pravis i koliko ti je efikasan rad sa memorijom bitan (mada danas ljudi uglavnom budze prvo shto im padne na pamet, pa posle Windows kriv shto mu posle sat vremena komp "neshto usporio").
Fragmentacija memorije je veliko zlo iz kog te nekad OS mozhe izvuci, a nekad ne (npr. ako pravish neshto za makine koje nemaju swap-file, npr. konzole :)
Zamisli da radish realloc() kao u gornjem primeru gde stalno cimash OS za po 4 bajta, pa jedno parce te memorije posle oslobodish, pa odmah trazhish novo itd...
Ukratko, memorija ce nakon nekog vremena da lichi na rezanca i necesh imati nijedan normalan contiguous-block memorije kad ti bude trebao! Zato sam i pomenuo custom memory-manager koji bi to malo inteligentnije radio, ili izbegao realloc() u potpunosti!
[ Dragi Tata @ 06.01.2004. 03:13 ] @
Na Windows XP/2003 možeš da napraviš poseban low-fragmentation dynamic heap sa HeapCreate.