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

2 pitanja

[es] :: C/C++ programiranje :: 2 pitanja

[ Pregleda: 3381 | Odgovora: 8 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Predrag Damnjanovic
Predrag Damnjanovic
Nis, Srbija

Član broj: 141
Poruke: 1305
*.bankerinter.net

Sajt: www.mycity.rs


+1 Profil

icon 2 pitanja18.08.2002. u 16:09 - pre 263 meseci
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).
 
Odgovor na temu

Milan Aksic

Član broj: 412
Poruke: 1053
*.ptt.yu



Profil

icon Re: 2 pitanja18.08.2002. u 16:25 - pre 263 meseci
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.
 
Odgovor na temu

leka
Dejan Lekić
senior software engineer, 3Developers
Ltd.
London, UK

Član broj: 234
Poruke: 2534
*.telia.com

Sajt: dejan.lekic.org


+2 Profil

icon Re: 2 pitanja18.08.2002. u 18:55 - pre 263 meseci
Po ANSI-ju je. :)
Dejan Lekic
software engineer, MySQL/PgSQL DBA, sysadmin
 
Odgovor na temu

Predrag Damnjanovic
Predrag Damnjanovic
Nis, Srbija

Član broj: 141
Poruke: 1305
*.bankerinter.net

Sajt: www.mycity.rs


+1 Profil

icon Re: 2 pitanja18.08.2002. u 22:09 - pre 263 meseci
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 :)
 
Odgovor na temu

Milan Aksic

Član broj: 412
Poruke: 1053
*.ptt.yu



Profil

icon Re: 2 pitanja18.08.2002. u 22:41 - pre 263 meseci
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.
 
Odgovor na temu

tOwk
Danilo Šegan
Zemun/Beograd

Član broj: 94
Poruke: 2743
*.bitsyu.net

ICQ: 9344053
Sajt: alas.matf.bg.ac.yu/~mm011..


+2 Profil

icon Re: 2 pitanja19.08.2002. u 04:08 - pre 263 meseci
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
Možda se moje mišljenje promenilo, ali ne i činjenica da sam u pravu.
 
Odgovor na temu

Predrag Damnjanovic
Predrag Damnjanovic
Nis, Srbija

Član broj: 141
Poruke: 1305
*.bankerinter.net

Sajt: www.mycity.rs


+1 Profil

icon Re: 2 pitanja19.08.2002. u 14:57 - pre 263 meseci
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?
 
Odgovor na temu

tOwk
Danilo Šegan
Zemun/Beograd

Član broj: 94
Poruke: 2743
*.bitsyu.net

ICQ: 9344053
Sajt: alas.matf.bg.ac.yu/~mm011..


+2 Profil

icon Re: 2 pitanja20.08.2002. u 00:31 - pre 263 meseci
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
Možda se moje mišljenje promenilo, ali ne i činjenica da sam u pravu.
 
Odgovor na temu

sspasic
Sasa Spasic

Član broj: 3261
Poruke: 175
*.medianis.net

Jabber: sspasic@elitesecurity.org
ICQ: 35454521


Profil

icon Re: 2 pitanja20.08.2002. u 11:01 - pre 263 meseci
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.
 
Odgovor na temu

[es] :: C/C++ programiranje :: 2 pitanja

[ Pregleda: 3381 | Odgovora: 8 ] > FB > Twit

Postavi temu Odgovori

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