Причина проста, но тонка: Функции C не могут быть объявлены для возврата массивов.
Когда вы возвращаете указатель, вот так:
char *foo(void)
{
char x[] = "hello";
return x;
}
return x;
- это , а не , фактически возвращающий x
. Он возвращает указатель на первый элемент x
1 - это то же самое, что сказать:
return &x[0];
Должно быть более понятно, почему это не правильно - это точно аналогично этому:
int *foo(void)
{
int x = 100;
return &x;
}
Однако можно возвращать структуры из функций - так что вы можете возвращать массив, если он заключен в struct
. Следующее вполне нормально:
struct xyzzy {
char x[10];
};
struct xyzzy foo(void)
{
struct xyzzy x = { "hello" };
return x;
}
1. Это является следствием правила особого случая для типов массивов. В выражении, если массив не является субъектом унарных операторов &
или sizeof
, он вычисляет указатель на свой первый элемент. Попытка определить настоящий массив в C - это все равно, что попытаться поймать туман в ваших руках - он просто исчезает, заменяется указателем.