Skocz do zawartości
Sid

[c++] Funkcja Zwracająca łańcuch [solved]

Rekomendowane odpowiedzi

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 przez Sid

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

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 )}

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

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 :]

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

Ładowanie


×
×
  • Dodaj nową pozycję...