Как вернуть массив char из функции?

Вопрос: Возможный дубликат: С++ возвращаемый массив в функции Я пробовал следующее: char[10] testfunc() { char[10] str; return str; } Лучший ответ: Лучше всего в качестве параметра out: 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 }

Вопрос:

Возможный дубликат:
С++ возвращаемый массив в функции

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

char[10] testfunc() { char[10] str; return str; } Лучший ответ:

Лучше всего в качестве параметра out:

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 } Ответ №1

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

Ответ №2

Вы должны понимать, что 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); Ответ №3

С Boost:

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

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

Ответ №4

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

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

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

Оцените статью
Добавить комментарий