Как мне вернуть массив символов из функции? - PullRequest
25 голосов
/ 14 апреля 2011

Я пробовал следующее:

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

    return str;
}

Ответы [ 6 ]

42 голосов
/ 14 апреля 2011

Лучший выходной параметр:

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

Вызывается с

int main(){
  char myStr[10];
  testfunc(myStr);
  // myStr is now filled
}
15 голосов
/ 14 апреля 2011

Вы должны понимать, что char[10] - это то же самое, что и char*.Вы на самом деле возвращаете указатель.Теперь указатель указывает на переменную (str), которая уничтожается при выходе из функции, поэтому указатель указывает на ... ничто!

Обычно в C вы явно выделяете память в этом случае, который не будет уничтожен при завершении функции:

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

Будьте осторожны!Память, на которую указывает str, теперь НИКОГДА не уничтожается.Это известно как «утечка памяти».Обязательно free() память после того, как вы сделали с ним:

foo = testfunc();
// do something with your foo
free(foo); 
12 голосов
/ 14 апреля 2011

Поскольку вы используете C ++, вы можете использовать std::string.

7 голосов
/ 14 апреля 2011

char char возвращается char *, но написанная вами функция не работает, потому что вы возвращаете автоматическую переменную, которая исчезает при выходе из функции. Используйте что-то вроде этого:

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

Это, конечно, если вы возвращаете массив в смысле C, а не std :: или boost :: или что-то еще. Как отмечено в разделе комментариев: не забудьте освободить память от абонента.

4 голосов
/ 14 апреля 2011

с усилением:

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

    return str;
}

Нормальный char[10] (или любой другой массив) не может быть возвращен из функции.

0 голосов
/ 18 февраля 2018

, когда вы создаете локальные переменные внутри функции, которые создаются в стеке, скорее всего, будут перезаписаны в памяти при выходе из функции. поэтому подобный код в большинстве реализаций c ++ не будет работать:

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

Исправление: создать переменную, которую нужно заполнить вне функции или где вы хотите ее использовать, а затем передать ее в качестве параметра и манипулировать функцией, например:

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
}

c ++ 11 решение с использованием std :: move (ch) для приведения lvalues ​​к 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;
}

или эта опция в 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;
}
...