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

时间:2016-06-08 11:24:00

标签: c

int (*)[3] foo ();无法正常工作。

如何将函数返回指针声明为3?

的数组

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

4 个答案:

答案 0 :(得分:4)

我建议不要这样做。

对于C无法将数组作为返回值的明显限制,它通常作为一种糟糕的解决方法。

由于程序员将返回指向具有自动存储持续时间的函数中的数组的指针,因此通常会返回悬空指针。然后这被黑客攻击static,它破坏了线程模型并打破了之前返回的所有指针!

只是稍微好一点就是返回一个由函数内部malloc调用给你的指针。但是,这会给呼叫者带来负担(不对称),不得不在某个时刻呼叫free。最终,您的函数会出现在某种预编译库中,该库使用与客户端不同的C运行时。您的malloc及其free不再匹配,最终导致卡车装载未定义的行为!

而不是所有这些,请考虑在函数参数列表中通过指针传递数组,最好预先分配内存。

答案 1 :(得分:4)

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

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

但是,正如其他评论和答案所示,返回数组指针通常是非常值得怀疑的做法。这样做的必要性可能表明程序设计不佳。