web-dev-qa-db-fra.com

Comment renvoyer un tableau de caractères à partir d'une fonction?

J'ai essayé ce qui suit:

char[10] testfunc()
{
    char[10] str;

    return str;
}
26
Datoxalas

Meilleur comme paramètre de sortie:

void testfunc(char* outStr){
  char str[10];
  for(int i=0; i < 10; ++i){
    outStr[i] = str[i];
  }
}

Appelé avec

int main(){
  char myStr[10];
  testfunc(myStr);
  // myStr is now filled
}
43
Xeo

Vous devez comprendre que char[10] Est identique à char*. Vous retournez en fait un pointeur. Maintenant, le pointeur pointe vers une variable (str) qui est détruite dès que vous quittez la fonction, donc le pointeur pointe sur ... rien!

Habituellement, en C, vous allouez explicitement de la mémoire dans ce cas, qui ne sera pas détruite à la fin de la fonction:

char* testfunc()
{
    char* str = malloc(10 * sizeof(char));
    return str;
}

Attention cependant! La mémoire pointée par str n'est plus JAMAIS détruite. C'est ce qu'on appelle une "fuite de mémoire". Assurez-vous de free() la mémoire une fois que vous en avez terminé:

foo = testfunc();
// do something with your foo
free(foo); 
15
Marijn van Vliet

Comme vous utilisez C++, vous pouvez utiliser std::string.

12
Flinsch

un tableau char est renvoyé par char *, mais la fonction que vous avez écrite ne fonctionne pas car vous renvoyez une variable automatique qui disparaît lorsque la fonction se ferme. Utilisez quelque chose comme ceci:

char *testfunc() {
    char* arr = malloc(100);
    strcpy(arr,"xxxx");
    return arr;
}

Bien sûr, si vous retournez un tableau au sens C, pas un std :: ou boost :: ou autre chose. Comme indiqué dans la section commentaire: n'oubliez pas de libérer la mémoire de l'appelant.

7
Felice Pollano

Avec Boost:

boost::array<char, 10> testfunc()
{
    boost::array<char, 10> str;

    return str;
}

Un char[10] Normal (ou tout autre tableau) ne peut pas être renvoyé par une fonction.

4
MSalters

lorsque vous créez des variables locales à l'intérieur d'une fonction qui sont créées dans la pile, elles sont très probablement écrasées en mémoire lors de la fermeture de la fonction. donc le code comme celui-ci dans la plupart des implémentations c ++ ne fonctionnera pas:

char[] pupulateChar()
{
    char* ch = "wonet return me";
    return ch;
}

un correctif consiste à créer la variable qui doit être remplie en dehors de la fonction ou à l'endroit où vous souhaitez l'utiliser, puis la transmettre en tant que paramètre et manipuler la fonction, par exemple:

void populateChar(char* ch){
    strcpy(ch,"fill me will, this will stay",size); // this will work as long it won overflow it. 
}
int main(){
    char ch[100]; // reserve memory in stack outside the function
    populateChar(ch); //populate array
}

solution c ++ 11 utilisant std :: move (ch) pour convertir lvalues ​​en rvalues

void populateChar(char* && fillme){
    fillme = new char[20];
    strcpy(fillme, "this worked for me");
}
int main(){
    char* ch;
    populateChar(std::move(ch));
    return 0;
}

ou cette option en c ++ 11:

char* populateChar(){
    char* ch = "test char";
    // will change from lvalue to r value
    return std::move(ch);
}
int main(){
    char* ch = populateChar();
    return 0;
}
0
devcodexyz