Funkcja zwracajaca strukture.

0

Mam funkcje zwracajaca strukture:

struct obraz funkcja(struct obraz *obrazwejsciowy)
{
struct obraz obrazpomocniczy;
//tutaj allokuje pamiec na tablice bedaca elementem struktury
return obrazpomocniczy;
}
 

W mainie wyglada to tak:

 
struct obraz obrazx;
obrazx=funkcja(&obrazwe);

Wszystko działa poprawnie ale zastanawiam sie czy zwracajac strukture funkcja nie jest ona czasem kasowana po zakonczeniu funkcji.
Nie wykorzystuje w tym fragmencie czasem tego ze nie sa czyszczane smieci z pamieci i czy nie ma ryzyka ze tej struktury moze juz nie byc w pamieci w momencie przypisywania?
Ten problem zasygnalizował mi prowadzacy zajecia. Mowil ze jezeli w funkcji allokowalbym pamiec na strukture wtedy nie byloby problemu ze jest ona kasowana az do momentu uzycia funckji free();

Prosze o jakis komentarz do tej sytuacji. No i czy ten kod jest poprawny czy nie?

0

Jest poprawny z tego względu, że kopiujesz dane do zmiennej obrazx z tego co zwróci funkcja. Problem by był gdybyś zwracał wskaźnik i go zapisywał - wtedy pokazywałby na miejsce w pamięci, gdzie kiedyś była zmienna.

0

A jezeli w srodku tej funkcji allokuje pamiec na tablice 2 wymiarowa bedaca elementem tej struktury to kiedy muszę ją zwolnic? Czy moze to ze struktura jest lokalna rozwiazuje problem gdyz wszystkie jej elementy znikna po wyjsciu z funckji.

0

Nie rozwiązuje tego problemu, musisz sam zwolnić przydzieloną pamięć kiedy już nie będzie potrzebna.

0

Tylko kiedy jak zrobie to przed returnem to funkcja nie bedzie zwracala danych o ktore mi chodzi. Jezeli zrobie na zewnatrz to bede sie odwolywal do zmiennej lokalnej...

0

Nie nie będziesz się odwoływał do zmiennej lokalnej (zakładam, że tablicę trzymasz przy pomocy wskaźnika)

0

Mam ciągle problem z tym w ktorym miejscu zwolnic pamiec:

 
struct nazwa element;
element.tablicadwuwymiarowa = (int**)malloc(element->wys * sizeof(int*)); 
for(i=0; i<element->wys; i++)
	{ 
		   *(element.tablicadwuwymiarowa+i)=(int*)malloc(element->szer*sizeof(int)); 
	}

tak wyglada allokacja pamieci na tablice dwuwymiarowa bedaca elementem struktury.
Jezeli zwolnie przydzielona pamiec w funkcji to return nie zwroci tego co oczekuje.
Jezeli proboje ja zwolnic w mainie to wypisuje bład ze odnosze sie do undefined variable.

Zrobiłem również opcje ze zwracaniem wskaznika do dynamicznie allokowanej struktury:

struct nazwa *element;
element=(struct nazwa*)malloc(sizeof (struct nazwa));
pozniej allokuje tablice dwuwymiarowa tak jak wyzej
i zwracam
return *element
 

I w tym zapisie nie ma ryzyka ze odnosze sie do zmiennej lokalnej bo jest dynamicznie allokowana(czyli bedzie az do momentu uzycia free)
Tylko znowu powstaje problem gdzie uzyc free?

Co do mojego pierwszego pytania w tym temacie dalej mam watpliwosci czy to nie jest odniesienie sie do zmiennej lokalnej... od innej osobyy uzyskałem odpowiedz ze jest :(

0
element = (struct nazwa*) malloc(sizeof (struct nazwa));
...
return *element; //<--- !!!

Po co tworzysz element dynamicznie, jeśli nic z tego nie wynika i w dodatku powoduje wyciek? Teraz zwracasz zawartość pamięci, na która wskazuje element, zamiast zwrócić wskaźnik, który możesz później zwolnić.

0

Ok zmieniłem to zwracam wskaznik:

 return element;

W mainie mam:

 wyjsciowa=*funkcja()

I jak mam zwolnić tą pamięć?
probowałem

 free(&wyjsciowa);

Ale to chyba zly sposob :( No i pozostaje problem z tą pamiecia allokowana na tablice dwuwymiarową :/

0

W mainie mam:

 wyjsciowa=*funkcja()

Źle. Zrobiłeś dokładnie to samo, co wcześniej, tylko na zewnątrz funkcji. Powinno być:

nazwa* wyjsciowa = funkcja();

// coś tam, coś tam

free(wyjściowa);

Oczywiście przed usunięciem wyjściowa powinieneś także zwolnić pamięć, której wskaźniki są wewnątrz struktury.

0

A juz rozumiem jak zwolnic ta struktore i na czym polegał moj blad.
Wlasnie druga czesc mojego pytania polega na tym że nie wiem jak z zewnatrz zwolnic te elementy struktury ktore allokuje w funkcji...

//edit mam

 
wskaznik=funkcja();
free(*(wskazniknastrukture->tablicadwuwymiarowa));
free(wskaznik->tablicadwuwymiarowa);
free(wskaznik);

Dziekuje o pomoc i prosze jeszcze inne osoby o odpowiedz na moj pierwszy post czy ta funkcja zwracajaca strukture jest poprawna czy jednak nie i jedynym dobrym rozwiazaniem jest tak jak teraz to zrobiłem.

0

Najpierw usuwasz pamięć na którą wskazują kolejne elementy tablicadwuwymiarowa, a na końcu sama tablicę.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.