Sid Opublikowano 5 Czerwca 2007 Zgłoś Opublikowano 5 Czerwca 2007 (edytowane) Witam :) Mam mały problem. Nigdy się nie mogę połapać z tymi wskaźnikami i duperelami. W uproszczeniu mam coś takiego: char* zwroc() { char tekst[20]; sprintf(tekst, "[gluteus maximus]"); return tekst;} Probuje to odczytywac w ten sposob: void jakasfunkcja(){char* wynik;wynik = zwroc();printf("%s", wynik);} Działa i trochę krzaczy a i warningi wywala podczas kompilacji... Co jeszcze trzeba zrobic? Pojechać po tym mallociem? Bo pierwszy raz używam zwracającą łańcuch funkcję(a raczej taką chcę użyć)... [EDIT] Widzę że pomaga zamiast: char tekst[20]; char *tekst = (char *) malloc (10); Edytowane 5 Czerwca 2007 przez Sid Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
PelzaK Opublikowano 6 Czerwca 2007 Zgłoś Opublikowano 6 Czerwca 2007 w pierwszym rozwiazaniu, tworzysz sobie tablicę na stosie wewnątrz funkcji... następnie zwracaasz do nej wskaźnik... po czym tablica ta jest usuwana przy wyjściu ze stosu... a ty dostajesz wskaźnik na pamięć, która zostałą już zwolniona. Przez chwilę zapewne będzie tam właściwy napis.. ale do czasu aż wysypie Ci sie program poprzez memory violation :) jeśli postąpisz w sposób drugi... to alokujesz sobie dynamicznie pamięć na stercie, która nie zostaje zwolniona gdy kończy sie funkcja... zatem dostajesz z powrotem prawidłowy wskaźnik na stringa... ale :) jeśli go potem sam nie zwolnisz... będziesz miał wycieki pamięci (memory leak). Sposób ten nie jest najszczęsliwszy, bo wywołujesz sobie jakąś funkcję, która alokuje pamięć i zwraca wskaźnik... potem mussiz każdy takie otrzymany wskaźnik przechowywać i gdy nie bedzie potrzebny uwolnić pamięć. kolejna sprawa.. jeśli mowa o C++ to nie uzywamy malloca jak to było za czasów ansi C, tylko operatora new. Lepiej jednak postąpić inaczej const int BUFF_SIZE = 255;void jakasfunkcja(){ char wynik[BUFF_SIZE]; // robisz sobie bufor na przewidywalna ilosc danych zwroc( wynik ); printf("%s", wynik);}// ta funkcja dostaje wskaznik na zaalokowana pamiecvoid zwroc( char* wynik ) { char tekst[] = "jakis tekst"; strcpy( wynik, tekst )} Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
MeHow Opublikowano 9 Czerwca 2007 Zgłoś Opublikowano 9 Czerwca 2007 Tak jak zrobil PelzaK jest slusznie, co powiem, jedynie slusznie! Wielkim szatanem jest to, ze funkcja cos przydziela, zwalnia za Ciebie. Takie praktyki koncza sie zazwyczaj segmentem i smutna twarza! Co do wskaznikow, to nie sa to duperele, a bardzo potezne narzedzie :] Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...