如何指定void指针数组的返回类型?

时间:2011-08-28 22:21:30

标签: c

我想返回一个指向void的指针数组。如何在函数原型中指定它?

int*[] func();

3 个答案:

答案 0 :(得分:1)

正如其他人所说,你无法真正做到这一点,因为数组会降级为指针。执行此操作的标准方法是返回结构

struct array {
    void* ptrs[5];
}

然后您的程序将被声明为

struct array foo() {...}

答案 1 :(得分:1)

示例:

void **function(int c)
{
    void **arrayOfVoidStars = (void **)malloc(c*sizeof(void *));
    /* fill the array */
    return arrayOfVoidStars;
}

答案 2 :(得分:1)

函数无法返回数组类型。您可以返回指向数组的第一个元素的指针(类型void **),也可以返回指向整个数组的指针(类型void (*)[N])。请注意,地址值的方式相同(数组的第一个元素的地址也是数组的地址),它只是类型的差异。

要返回指向void指针的SIZE元素数组的指针,函数签名将是

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;
}