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

Opet memorija i C

[es] :: C/C++ programiranje :: Opet memorija i C

[ Pregleda: 3714 | Odgovora: 7 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Ivan Vasić

Član broj: 14756
Poruke: 631
*.38.EUnet.yu

Jabber: ivasic@elitesecurity.org


Profil

icon Opet memorija i C05.01.2004. u 15:23 - pre 246 meseci
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...
 
Odgovor na temu

Reljam
Relja Markovic
San Francisco

Član broj: 531
Poruke: 1793
*.attbi.cable.earthlink.net



+18 Profil

icon Re: Opet memorija i C05.01.2004. u 16:24 - pre 246 meseci
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, ... );
 
Odgovor na temu

NastyBoy
Bojan Nastic
UK

Član broj: 12041
Poruke: 895
*.in-addr.btopenworld.com



+4 Profil

icon Re: Opet memorija i C05.01.2004. u 17:03 - pre 246 meseci
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 ...

 
Odgovor na temu

Goran Rakić
Beograd

Član broj: 999
Poruke: 3766

Sajt: blog.goranrakic.com


+125 Profil

icon Re: Opet memorija i C05.01.2004. u 17:44 - pre 246 meseci
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?
http://sr.libreoffice.org — slobodan kancelarijski paket, obrada teksta, tablice,
prezentacije, legalno bez troškova licenciranja
 
Odgovor na temu

Ivan Vasić

Član broj: 14756
Poruke: 631
*.62.EUnet.yu

Jabber: ivasic@elitesecurity.org


Profil

icon Re: Opet memorija i C05.01.2004. u 21:44 - pre 246 meseci
E, ljudi hvala...

Upalilo je Niz=realloc(Niz....
nije mi palo na pamet da to moze da zeza...
 
Odgovor na temu

Mikky

Član broj: 18
Poruke: 1563
*.vdial.verat.net

ICQ: 44582291


+58 Profil

icon Re: Opet memorija i C05.01.2004. u 23:48 - pre 246 meseci
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?
-I know UNIX, PASCAL, C, FORTRAN,
COBOL, and nineteen other high-tech
words.
 
Odgovor na temu

NastyBoy
Bojan Nastic
UK

Član broj: 12041
Poruke: 895
*.glfd.dial.virgin.net



+4 Profil

icon Re: Opet memorija i C06.01.2004. u 01:11 - pre 246 meseci
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!
 
Odgovor na temu

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
..ndg-pm4-2.dialup.nethere.net



+6 Profil

icon Re: Opet memorija i C06.01.2004. u 03:13 - pre 246 meseci
Na Windows XP/2003 možeš da napraviš poseban low-fragmentation dynamic heap sa HeapCreate.
 
Odgovor na temu

[es] :: C/C++ programiranje :: Opet memorija i C

[ Pregleda: 3714 | Odgovora: 7 ] > FB > Twit

Postavi temu Odgovori

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