Возвращаемое значение функции возвращается copy .В первом примере вы получаете копию целочисленной переменной из функции.Во втором вы получите копию указателя на символ , а не копию строки.
Указатель ссылается на строковые данные, которые имеют автоматическое хранение, поэтому он больше не действителен после возврата из функции.Пространство становится доступным для использования другим кодом и многие могут быть изменены - любая попытка доступа к нему имеет неопределенное поведение.
Дело в том, что возвращается указатель, а не строка;в Си строки (и, в более общем случае, массивы) не являются типами данных первого класса.
В зависимости от ваших потребностей существует несколько способов возврата строковых данных;например, допустимо следующее:
char* func()
{
static char c[] = "Hey there!";
return c;
}
, потому что здесь, несмотря на то, что локальная переменная выходит из области видимости, статические данные не уничтожаются и не распределяются, а любая ссылка на них остается действительной.
Другой альтернативой является встраивание строки в структуру, которая является типом данных первого класса:
typedef struct
{
char content[256] ;
} sString ;
sString func()
{
sString c = {"Hey there!"};
return c;
}
Или условно copy данные в буфер вызывающего абонента:
char* func( char* buffer )
{
char c[] = "Hey there!";
strcpy( buffer, c ) ;
return buffer ;
}
Я пропустил код, чтобы уменьшить вероятность переполнения буфера выше для ясности в этом последнем примере, такой код рекомендуется.