Как правило встречаются такие способы передачи данных из функции.
Во-первых, можно в функции создать
статический массив в функции, а потом возращать указатель на него. Как то так:
Код: Выделить всё
#define MAXLINE 100
char* get_name_addition(void)
{
static char name[MAXLINE];
fgets(name,MAXLINE,stdin);
... // Какие-то дополнительные действия
return *name;
}
Типичная практика для Unix-а (насколько могу судить), но, как нетрудно заметить, это функция не совместима с многопоточным программированием. Эту функцию можно переделать для многопоточных приложений, используя собственные данные потоков (Thread-Specific Data), но лучше сразу делать иначе.
Пожалуй самая распространенная практика - это передать в функцию буфер для записи - этот буфер не будет привязан к стеку выполняемой функции.
Код: Выделить всё
#define MAXLINE 100
int get_name_addition(char *name, size_t n)
{
fgets(name, n, stdin);
...
return 0;
}
Не всегда можно заранее угадать, сколько нужно выделить места для буфера - это подчас известно только в вызываемой функции. К примеру в Win эта задача часто решается повторным вызовом одной функции: первый раз задаем нулевой буфер и узнаем необходимый размер; второй раз вызывает функцию с буфером достаточного размера и получаем в него данные. Здесь, в никсах, мне такого не попадалось.
Но встречается более простой способ. В вызываемой функции malloc-ом создаем буфер. Но для его очистки создаем еще одну дополнительную функцию.
Код: Выделить всё
#define MAXLINE 100
char* get_name_addition(void)
{
char* name;
name = (char*)malloc(MAXLINE);
fgets(name, MAXLINE, stdin);
...
return name;
}
void get_name_free(char* name)
{
free(name);
}
Соответственно, использовать это надо так:
Код: Выделить всё
int main(void)
{
char *name;
name = get_name_addition();
// Что-то делаем
...
get_name_free(name);
return 0;
}
Конечно, в данном случае можно было бы в main-е просто вызвать free. Но, во первых, возращаемые данные не обязательно будут линейным куском памяти, а могут оказаться каким нибудь связным списком. Во-вторых, если функция та находится в разделяемой библиотеке, я бы не стал исключать случай, что там могла быть слинкована другая реализация malloc-а.