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

标签 c

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

int*[] func();

最佳答案

函数不能返回数组类型。您可以返回指向数组第一个元素的指针(类型 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;
}

关于c - 如何指定指向 void 的指针数组的返回类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7224356/

相关文章:

c - 内存分配优化 : from heap to stack

c - 如何在 Linux 上调试 LEX/FLEX 程序

c++ - 使用 QSharedMemory 附加现有的共享内存

c - Fork 并等待 pid 检查之外的子进程

c - OpenGL C - 我将如何从行星上绘制一条线迹?

c - pthread_create写回的时机

在同一进程的不同线程中使用 select() 的成本

c - 通过 ncurses 的引用行为传递

c - 如何让函数通过命令行打印出一定数量的随机数? C

在 C 程序中检查文件属性