Funkcja zwracająca wskaźnik do tablicy stringów

0

Cześć mam problem (jak podejrzewam) ze zrozumieniem wskaźników. otóż mam funkcję, w której jest sobie tablica jakaś i chciałbym wysłać ten wskaźnik do programu, a tam korzystać z tej tablicy, która jest w tej funkcji. tzn - najchętniej to chciałbym, żeby funkcja zwróciła tablicę ale to chyba nierealne, prawda?

mam tak:

*string funkcja() { 

  string * nieszczęsny_wskaznik;
  string tab[3] = { "wyraz1", "wyraz2", "wyraz3" } 
  
  nieszczęsny_wskaźnik = tab;

 return nieszczęsny_wskaźnik; 

         }


void main() { 

         string tablica[3];


        tablica=funkcja(); 
       // i swietnie by bylo gdyby teraz: 

        tablica[0] = "wyraz1";
        tablica[1] = "wyraz2";
        tablica[2] = "wyraz3"; 

}

doskonale sobie zdaję że ten kod jest do niczego, ale mam nadzieję, że zrozumieliście o co mi chodzi i jakoś pomożecie mi to rozwiązać.

0

Po wyjściu z "funkcja" tab jest kasowane, więc nie możesz się odwoływać do tej pamięci. Dobrym pomysłem jest nauczenie się vectorów z STL lub:

#include <iostream>
#include <string>
using namespace std;

string* funkcja()
{
    string * wsk;
    wsk=new string[3];
    wsk[1]="ala ma kota";
    return wsk;
}


int main()
{
    string * tablica;
    tablica=funkcja();
    cout << tablica[1] << endl;
return 0;
}
0

@TroYan:
Zauważ proszę, że mimo iż @marseel pokazał Ci zrobić dokładnie to, o co prosiłeś, to jednak ten sposób jest dość niebezpieczny. Wewnątrz funkcji używasz operatora new, przydzielając pamięć tablicy. Na zewnątrz tej funkcji, gdy już skończysz pracować z tą tablicą, pamiętać o jej zwolnieniu za pomocą operatora delete. Jeśli zwolnisz pamięć, to nic złego się nie stanie. Jeśli jednak zapomnisz, to będziesz miał wyciek pamięci. Pewnym (nie idealnym) sposobem, żeby pamiętać o zwolnieniu pamięci jest nazwanie funkcji new_costam. Np. new_tablica_wyrazów(). Wtedy można mieć nadzieję, że jeśli zobaczysz:

string* tab = new_tablica_wyrazów();

To przypomni Ci to o tym, że musisz na końcu skasować tę tablicę:

string* tab = new_tablica_wyrazów();
// praca nad tab
// ...
delete [] tab;

Gdy zapomnisz o tej ostatniej linijce, to będziesz miał memory-leaka.

0

To oznacza ze należało by, zrobić tak ?

#include <iostream>
#include <string>
using namespace std;
 
string* funkcja()
{
    string * wsk;
    wsk=new string[3];
    wsk[1]="ala ma kota";
    return wsk;
}
 
int main()
{
    string * tablica;
    tablica=funkcja();
    cout << tablica[1] << endl;
delete[] tablica; //      nie *wsk !
return 0;
}
0

jak już używać C++ (11) to lepiej nie mieszać w to C

std::vector<string> funkcja() { 
  std::vector<string> tab { "wyraz1", "wyraz2", "wyraz3" } 
  return tab;
}

A problem mas nie ze zrozumieniem wskaźników, ale ze zrozumieniem czasu życia obiektów i jaka jest różnica między obiektem globalnym, lokalnym (tworzonym na stosie, stack) i tworzonym na stercie (heap).

1 użytkowników online, w tym zalogowanych: 0, gości: 1