Как мне указать тип возвращаемого значения для массива указателей на void? - PullRequest
0 голосов
/ 29 августа 2011

Я хочу вернуть массив указателей на void. Как мне указать это в прототипе функции?

int*[] func();

Ответы [ 3 ]

1 голос
/ 29 августа 2011

Пример:

void **function(int c)
{
    void **arrayOfVoidStars = (void **)malloc(c*sizeof(void *));
    /* fill the array */
    return arrayOfVoidStars;
}
1 голос
/ 29 августа 2011

Функции не могут возвращать типы массивов. Вы можете либо вернуть указатель на первый элемент массива (тип 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;
}
1 голос
/ 29 августа 2011

Как говорили другие люди, вы не можете этого сделать, потому что массивы будут уменьшаться до указателей. стандартный способ сделать это - вернуть структуру

struct array {
    void* ptrs[5];
}

тогда ваша процедура будет объявлена ​​как

struct array foo() {...}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...