Функции не могут возвращать типы массивов. Вы можете либо вернуть указатель на первый элемент массива (тип void **
), либо вы можете вернуть указатель на весь массив (тип void (*)[N]
). Обратите внимание, что значение адреса в любом случае одинаково (адрес первого элемента массива также является адресом массива), это просто различие в типах.
Чтобы вернуть указатель на массив элементов SIZE с указателем на void
, сигнатура функции будет
void *(*func())[SIZE]
, который разбивается как
func -- func
func() -- is a function
*func() -- returning a pointer
(*func())[SIZE] -- to a SIZE-element array
*(*func())[SIZE] -- of pointer
void *(*func())[SIZE] -- to void.
Помните, что постфиксные операторы, такие как []
и ()
, имеют более высокий приоритет, чем унарные операторы, такие как *
, поэтому *a[]
является массивом указателей, а (*a)[]
является указателем на массив.
Для C89 и более ранних версий SIZE должен быть константным выражением времени компиляции. Для C99 вы можете использовать переменное выражение.
Что бы вы ни делали, не пытайтесь вернуть указатель на массив, локальный для функции, такой как
void *(*func())[SIZE]
{
void *foo[SIZE];
...
return &foo;
}
или
void **func()
{
void *foo[SIZE];
...
return foo;
}
После выхода из функции foo
перестает существовать, и возвращаемое значение указателя больше не указывает ни на что значимое. Вы либо должны будете объявить массив как static
в своей функции, либо вам придется динамически распределять его:
void *(*func())[SIZE]
{
void *(*foo)[SIZE] = malloc(sizeof *foo);
...
return foo;
}
или
void **func()
{
void **foo = malloc(sizeof *foo * SIZE);
...
return foo;
}