如何声明函数返回类型`int(*)[3]`



int (*)[3] foo ();不工作。

如何声明函数返回指针指向3的数组?

这可能没有用,但我想知道这是否可能。

首先,我同意其他答案,即您可能需要一个typedefstruct来澄清。

如果您想知道如何声明返回类型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);

然而,正如其他评论和答案所指出的,返回数组指针通常是一开始就很有问题的做法。这样做的必要性可能表明程序设计不佳。

最新更新