Return char * array în C++ [duplicate] (Programare, C++)

user987316 a intrebat.

Pentru a returna o matrice char * array dintr-o funcție am următoarea definiție. nu se compilează SO Am nevoie de sugestii de la experți pentru a o modifica. Scopul meu final este de a avea char * array de la o funcție.

char * []GetItems()
{
const char *Items[] = {"Item1" , "Item2" , "Item3"};


//processing items..


return Items
}

Mulțumesc pentru ajutor.

Comentarii

  • Cred că ar trebui să eliminați „[]” înainte de GetItems() –  > Por MD. Khairul Basar.
  • Deși nu este ceea ce ați cerut, vă sugerează să folosiți un std::vector din std::strings în schimb în C++. –  > Por blackbird.
  • @KhairulBasar, ceea ce ar duce la un rezultat greșit. tip pentru valoarea de returnare. –  > Por WhozCraig.
  • Nu cred că aceasta este o dublură a întrebării „Poate fi accesată memoria unei variabile locale în afara domeniului său de aplicare?”. Întrebarea principală a lui OP se referă la tipul de returnare, adică la modul în care se returnează o matrice de șiruri de caractere. Întâmplarea face ca el să o fi ilustrat cu o variabilă locală. –  > Por abligh.
  • @abligh Nu contează dacă titlul și întrebarea principală se potrivesc exact. Dublul marcat are un răspuns acceptat (și foarte votat), care explică problema (exact cea pe care o cere OP) în profunzime. –  > Por πάντα ῥεῖ.
3 răspunsuri
Mureinik

Sunt trei probleme aici:

  1. Pentru a returna o matrice în c / c++, trebuie doar să utilizați un alt * și nu [].
  2. Tipul de returnare trebuie să fie marcat ca const deoarece se returnează un array const variabilă.
  3. Returnarea unui pointer local nu este aproape niciodată o idee bună…

Deci, pentru a compila:

// Note the return type is const char**
const char** GetItems() 
{
    // Note this is still a local variable - you'll have to deal with that
    static const char *Items[] = {"Item1" , "Item2" , "Item3"};

    //processing items..
    return Items;
}

Comentarii

  • Vă sugerez serios să fie static –  > Por WhozCraig.
  • Probabil că nu este o idee rea – editat. Mulțumesc! –  > Por Mureinik.
MSH

Nu puteți avea o matrice ca parametru de retur în C++Ar trebui să folosiți fie char** ca parametru de retur, fie să folosiți std::vector < std::string > > > dacă scrieți cod C++.

Mult noroc!

abligh

Aveți trei probleme aici.

  1. Array-urile C se degradează în pointeri. Nu puteți returna array-uri C ca atare, ci doar un char **. Acesta nu are o dimensiune implicită, așa că veți avea nevoie de o santinelă (de exemplu, a NULL) la sfârșit. Sau utilizați a std::vector în C++.

  2. Nu ar trebui să returnați adresa unei variabile locale dintr-o funcție, deoarece adresa de memorie a acesteia poate fi suprascrisă imediat ce funcția iese. Va trebui să malloc (sau new în C++ pentru a aloca matricea. În exemplul de mai jos am făcut-o globală.

  3. Nu puteți avea un const declarație a tabloului și totuși să îl returnați ca non-const fără o cast. Presupunând că sunteți în procesare, renunțați la const.

Încercați ceva de genul:

#include <stdio.h>
#include <stdlib.h>

// Use char* casts to enable the 'processing' later, i.e. do not use
// const strings
char *Items[] = { (char*) "Item1", (char*) "Item2", (char*) "Item3", NULL };

char **
GetItems ()
{
  //processing items..

  return Items;
}

int
main (int argc, char **argv)
{
  int i;
  char **items = GetItems ();
  for (i = 0; items[i]; i++)
    {
      printf ("Item is %s
", items[i]);
    }
  exit (0);
}

Comentarii

  • warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]. Nu faceți asta. –  > Por n. „pronume” m..
  • @n.m. : gcc -Wall nu produce asta, dar g++ -Wall o face; cred că este o diferență între C++ și C. –  > Por abligh.
  • Întrebarea este etichetată C++, nu C. –  > Por n. ‘pronouns’ m..
  • @n.m. Da, dar părea să fie vorba despre tipuri C. Dacă vrea să o facă în modul C++, OP ar trebui să folosească std::vector din std::string așa cum am subliniat. Se pune (char *) înainte de "Item1" etc. corectează avertismentul (și voi edita răspunsul pentru a face acest lucru), dar depinde cu adevărat ce fel de „procesare” face OP. –  > Por abligh.
  • Nu că ar trebui să faci asta nici în C. În C, tipul de literali de șiruri de caractere este char[N] (nu const), dar nu pot fi scrise. De aceea, ar trebui să folosiți -Wwrite-strings cu gcc. Ceea ce este total irelevant, deoarece întrebarea nu este etichetată C. Ai putea la fel de bine să dai sfaturi despre Haskell sau Python. –  > Por n. „pronume” m..

Tags: