int (*)[3] foo ();
无法正常工作。
如何将函数返回指针声明为3?
的数组它可能没用,但我想知道它是否可能。
答案 0 :(得分:4)
我建议不要这样做。
对于C无法将数组作为返回值的明显限制,它通常作为一种糟糕的解决方法。
由于程序员将返回指向具有自动存储持续时间的函数中的数组的指针,因此通常会返回悬空指针。然后这被黑客攻击static
,它破坏了线程模型并打破了之前返回的所有指针!
只是稍微好一点就是返回一个由函数内部malloc
调用给你的指针。但是,这会给呼叫者带来负担(不对称),不得不在某个时刻呼叫free
。最终,您的函数会出现在某种预编译库中,该库使用与客户端不同的C运行时。您的malloc
及其free
不再匹配,最终导致卡车装载未定义的行为!
而不是所有这些,请考虑在函数参数列表中通过指针传递数组,最好预先分配内存。
答案 1 :(得分:4)
首先,我同意其他答案,您可能需要typedef
或struct
来澄清。
如果您想知道如何声明返回类型,那就是
int (*foo(void))[3] {
在"declaration reflects use"模式中,您可以通过考虑使用情况来构建它,即如何从foo
的类型转换为普通类型int
:
foo
foo()
*foo()
(*foo())[i]
;因为后缀语法优先于前缀1,所以需要使用括号。int
宣言反映出来:
foo
foo(void)
,插入void
表示它特别是0-param函数而不是带有未指定参数集的函数*foo(void)
(*foo(void))[3]
,使“index”成为数组的大小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 %d\n", (*(foo()))[0], (*(foo()))[1], (*(foo()))[2]);
return 0;
}
旁注:确保返回指针的数组在函数返回后将继续存在。
答案 2 :(得分:2)
一种方法是:
typedef int Int_array_3[3];
Int_array_3 * foo(void);
答案 3 :(得分:1)
根据经验,避免函数传递/返回原始数组指针或函数指针,因为这样的代码是编程和读取的噩梦。在这种情况下,它本来是
int (*func()) [3]
完全不可读。忘记编写这样的代码。而是使用typedef来定义数组类型:
typedef int iarr3_t [3];
然后编写一个返回指向这样一个数组的指针的函数:
iarr3_t* func (void);
但是,正如其他评论和答案所示,返回数组指针通常是非常值得怀疑的做法。这样做的必要性可能表明程序设计不佳。