我想返回一个指向void
的指针数组。如何在函数原型中指定它?
int*[] func();
答案 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;
}