Forum Sveta kompjutera

Nazad   Forum Sveta kompjutera > Test Run > Programiranje

Programiranje Programski jezici, tehnike, alatke...

Odgovor
 
Alatke vezane za temu Vrste prikaza
Stara 15.4.2017, 22:26   #1
NovaNada
Član
 
Član od: 13.3.2017.
Poruke: 55
Zahvalnice: 30
Zahvaljeno 3 puta na 3 poruka
Određen forumom C - oslobadjanje alocirane memorije

Interesuje me kako je nadjbolje osloboditi memoriju zauzetu na sledeći način:
U main() funkciji imam pokazivač i alocirao sam memoriju za njega ovako:
Kod:
double *p; p = calloc(n, sizeof(double));
i tako dobio niz čiji su elementi tipa double.
Zelim da napravim funkciju koja vraća pokazivač na niz.
Kod:
double* funkcija(int n)
{
    double *p;
    p = calloc(n, sizeof(double));
    // obrada ...
    return p;
}
Kako da oslobodim memoriju koju sam zauzeo u telu funckije iz main()-a?
Hvala
NovaNada je offline   Odgovor sa citatom ove poruke
Stara 15.4.2017, 22:58   #2
voodoo_
V.I.P. GNU/Linux
 
Avatar korisnika voodoo_
 
Član od: 1.11.2005.
Poruke: 11.163
Zahvalnice: 2.081
Zahvaljeno 4.922 puta na 2.858 poruka
Određen forumom Re: C - oslobadjanje alocirane memorije

Kada si uradio "calloc(n, sizeof(double))", memorijski alokator operativnog sistema je to razumeo kao zahtev za alokaciju kontinualnog bloka memorije dužine n * sizeof(double), to jest efekat je potpuno isti kao da si uradio "calloc(1, n * sizeof(double))". Dakle memoriju oslobađaš sa "free(adresa koju je vratio calloc)". Nije bitno što toj adresi u samoj funkciji pristupaš preko "p", a rezultat funkcije ćeš upisati u pokazivač pod nekim drugim imenom - bitna je sama adresa koju ti pokazivači sadrže. Ovo je potpuno legitiman kod:

Kod:
double *a = funkcija(n);
free(a);
S tim što bi trebalo da dokumentuješ podatak da funkcija radi neku alokaciju i da je na pozivaocu da oslobodi tu memoriju nakon što završi s njom, kako bi se izbeglo curenje.
voodoo_ je offline   Odgovor sa citatom ove poruke
Sledeći korisnik se zahvaljuje korisniku voodoo_ na korisnoj poruci:
NovaNada (16.4.2017)
Stara 16.4.2017, 9:06   #3
NovaNada
Član
 
Član od: 13.3.2017.
Poruke: 55
Zahvalnice: 30
Zahvaljeno 3 puta na 3 poruka
Određen forumom Re: C - oslobadjanje alocirane memorije

Hvala voodoo !
Sad mi je potpuno jasno kako treba da rešim problem.
NovaNada je offline   Odgovor sa citatom ove poruke
Stara 16.4.2017, 10:14   #4
Teva
Starosedelac
 
Član od: 23.2.2006.
Lokacija: Tamo gde su kuće od čokolade i prozori od marmelade....
Poruke: 1.579
Zahvalnice: 195
Zahvaljeno 301 puta na 171 poruka
Određen forumom Re: C - oslobadjanje alocirane memorije

Mala digresija, stekni naviku da kada oslobađaš memoriju da odmah setuješ pointer na NULL. Posebno ako budeš koristio free() negde pre kraja programa, može da ti uštedi dosta vremena i živaca xD

Kod:
free(p);
p = NULL;
Teva je offline   Odgovor sa citatom ove poruke
Sledeći korisnik se zahvaljuje korisniku Teva na korisnoj poruci:
NovaNada (16.4.2017)
Stara 16.4.2017, 10:35   #5
NovaNada
Član
 
Član od: 13.3.2017.
Poruke: 55
Zahvalnice: 30
Zahvaljeno 3 puta na 3 poruka
Određen forumom Re: C - oslobadjanje alocirane memorije

^Prihvaćen savet.

Šteta što čovek nema gde da pročita ovakve savete i dobre prakse, nego mora ili sam da otkriva ili ako ima sreće, kao ja sada, da mu neko otvori oči.
NovaNada je offline   Odgovor sa citatom ove poruke
Odgovor

Bookmarks sajtovi

Alatke vezane za temu
Vrste prikaza

Vaš status
Ne možete postavljati teme
Ne možete odgovarati na poruke
Ne možete slati priloge uz poruke
Ne možete prepravljati svoje poruke

BB kod: uključeno
Smajliji: uključeno
[IMG] kod: uključeno
HTML kod: isključeno


Slične teme
tema temu započeo forum Odgovora Poslednja poruka
Kupovina RAM memorije ZvOnKo650 Osnovne komponente 1 30.12.2009 1:12
antivirus na komp sa malo memorije? neko_drugi Zaštita 19 30.11.2009 9:42
Rizik u slučaju nekompatibilnosti memorije M1los Osnovne komponente 14 15.12.2007 23:33
Gubitak memorije na MP3 Stick-u Rokki Foto i audio/video 2 26.2.2006 22:31
Overclock DDR memorije! sasha vukelic Overklok 13 28.12.2005 16:11


Sva vremena su po Griniču +2 h. Sada je 10:55.


Powered by vBulletin® verzija 3.8.7
Copyright ©2000–2024, vBulletin Solutions, Inc.
Hosted by Beograd.com