[ Predrag Damnjanovic @ 18.08.2002. 16:09 ] @
Koliko je po ANSI C-u ovo:
Code:

char *a;
[...]
a[0]=0x00;


Dakle mislim konkretno na upisivanje/citanje na ovaj nacin.
Podrazumeva se da sam odradio malloc pre ovoga...

I drugo pitanje, da li bi trebalo pre malloc-a uraditi free? (narocito ako malloc upotrebljavam vise puta).
[ Milan Aksic @ 18.08.2002. 16:25 ] @
Da li mozes da malo pojasnis tvoje prvo pitanje?

Sto se drugog pitanja tice, uvek pre naredne nove alokacije memorije moras da oslobodis prethodno alociranu memoriju, da ne bi doslo do memory leak-a. Naravno, ako mislis na jednu istu promenljivu (kojoj si pokusao, da eventualno vise puta dodelis memoriju na slobodnom skladistu, bez prethodnog oslobadjanja), kojoj dodeljujes memoriju.
[ leka @ 18.08.2002. 18:55 ] @
Po ANSI-ju je. :)
[ Predrag Damnjanovic @ 18.08.2002. 22:09 ] @
A da li treba koristiti free pre prvog malloc-a?

A sto se tice prvog pitanja:
-------
char a[10];
char *b;

a[0]=0x00;

b=malloc(10);
b[0]=0x00;
-------

Da li su oba primera (i sa a i sa b) pravilna?
Koliko ja znam jesu, al' rek'o ajd da pitam :)
[ Milan Aksic @ 18.08.2002. 22:41 ] @
Sasvim je u redu, jer je i samo ime promenljive niza, pointer na prvi clan u nizu.

Ne moras da koristis free() pre 'prvog' malloc() tj. pre alociranja memorije.
free() oslobadja memoriju predhodno alociranu na heap-u, ako memorija nije alocirana onda i nema sta da vraca os-u tj. oslobadja.
[ tOwk @ 19.08.2002. 04:08 ] @
Nemoj da koristiš free() ako nisi alocirao memoriju pomoću neke od standardnih funkcija za alokaciju.

Na taj način, ukoliko baš nemaš sreće, se javlja efekat suprotan curenju memorije: oslobodićeš memoriju na koju možda pokazuje neki drugi pokazivač, i može nastati gužva ako je pomoću tog drugog pokazivača koristiš.

Po ISO C-u, ovakva akcija verujem da ima ,,nedefinisano ponašanje'', odnosno što manje truda uložiti u implementiranje takvih stvari, što može značiti upravo ovo što sam naveo.

Toliko
[ Predrag Damnjanovic @ 19.08.2002. 14:57 ] @
I konacno, ako imam funkciju koja kao parametar ima pointer na neki niz karaktera, kako da znam da li je taj niz vec alociran, tj. da li mu treba free?
Pada mi ideja da ga ja za svaki slucaj alociram odmah pri definisanju?
[ tOwk @ 20.08.2002. 00:31 ] @
To ti je lepota C-a: ne možeš da znaš.

Sve je to veoma sistemski zavisno, i ne postoji definitivan odgovor.

To je ono gde se lepo uklapa ono iz opisa foruma: ,,C -- jezik koji kombinuje mogućnosti asemblera sa lepotom i jednostavnošću asemblera''.


Ono što C programeri koriste u ovakvim slučajevima je stil i politika pisanja koda. Najčešće pravilo je insistirati da se memorija alocira i dealocira u istoj funkciji.

Prema tome, treba izbegavati slanje pokazivača na nealociranu memoriju, osim ako ne praviš neku funkciju kao što je ,,pd_alloc''. Čak i tada nećeš slati ovakav pokazivač, već ćeš samo vraćati novi.


C programiranje zahteva neverovatnu disciplinu. To je i njegova lepota :)

U svakom slučaju, kako odraditi neke od stvari možeš najbolje videti u standardnoj C biblioteci.

Naročito pogledaj neku funkciju za kopiranje nizova teksta, npr. strncpy. Ona ima 3 parametra: pokazivače na izvor i odredište, i najveću dužinu kopiranja. Odredište već mora biti alocirano i dovoljno veliko, inače može doći do ,,nedefinisanog ponašanja'' (u praksi najčešće segfaults).

Nadam se da je od pomoći,
Pozdrav koristim mobilni telefon. Znac
[ sspasic @ 20.08.2002. 11:01 ] @
Sto se dice discipline - evo dva prosta pravila koja pomazu da se precisti ogroman broj ovakvih situacija:
- kada deklarises pointer ili mu dodeli memoriju odmah ili ga postavi na NULL
- provera assert(pokazivac == NULL) na pocetku svake funkcije za sve parametre.