int (*)[3] foo ();
不工作。
如何声明函数返回指针指向3的数组?
这可能没有用,但我想知道这是否可能。
首先,我同意其他答案,即您可能需要一个typedef
或struct
来澄清。
如果您想知道如何声明返回类型int (*foo(void))[3] {
在"声明反映使用"模式中,您可以通过考虑使用来构建它,即如何从foo
的类型转换为普通类型int
:
- 服用
foo
- 调用它(不带参数):
foo()
- 取消引用返回值:
*foo()
- 添加数组索引:
(*foo())[i]
;括号是必需的,因为后缀语法将优先于前缀一 - 结果是普通类型的
int
声明反映了这一点:
- 服用
foo
- 调用它:
foo(void)
,插入void
表示它是一个0参数函数,而不是一个具有未指定参数集的函数 - 取消引用函数返回值:
*foo(void)
- 添加数组索引:
(*foo(void))[3]
,使"索引"为数组的大小 - 我们进入了普通类型,所以声明您构建的东西具有该类型:
int (*foo(void))[3]
示例代码:
#include <stdio.h>
int arr[3];
int (*foo(void))[3] {
return &arr;
}
int main (void) {
arr[0] = 413;
arr[1] = 612;
arr[2] = 1025;
printf("%d %d %dn", (*(foo()))[0], (*(foo()))[1], (*(foo()))[2]);
return 0;
}
附带说明:请确保在函数返回后,要返回指针的数组将继续存在。
我建议不要这样做。
对于C不能将数组作为返回值的明显限制,这种方法通常是一种糟糕的解决方法。
通常情况下,会返回悬空指针,因为程序员会返回指向函数中具有自动存储持续时间的数组的指针。然后,它被黑客入侵到static
,破坏了线程模型并破坏了之前返回的所有指针!
只是稍微好一点的是返回一个由函数内部的malloc
调用给您的指针。但是,这给主叫方带来了负担(不对称地),在某个时刻必须呼叫free
。最终,您的函数最终会被放入某种预编译库中,该库使用与客户端不同的C运行时。你的malloc
和他们的free
不再匹配,你最终会得到一辆行为不明的卡车!
与其考虑所有这些,不如考虑通过函数参数列表上的指针传递数组,最好是预分配内存。
一种方法是:
typedef int Int_array_3[3];
Int_array_3 * foo(void);
根据经验,避免函数传递/返回原始数组指针或函数指针,因为这样的代码对编程和读取来说都是一场噩梦。在这种情况下,应该是
int (*func()) [3]
这是完全不可读的。忘记写这样的代码吧。相反,使用typedef来定义数组类型:
typedef int iarr3_t [3];
然后写一个函数,返回一个指向这样一个数组的指针:
iarr3_t* func (void);
然而,正如其他评论和答案所指出的,返回数组指针通常是一开始就很有问题的做法。这样做的必要性可能表明程序设计不佳。