在C++中返回一个已知大小的数组?

6

如果我可以传递一个已知大小的数组:

void fn(int(*intArray)[4])
{
    (*intArray)[0] = 7;
}

为什么我不能返回一个值:
int intArray[4] = {0};
int(*)[4] fn()
{
    return &intArray;
}

在这里,"(*)"中的 ")" 会生成 "语法错误:)"。

你正在传递一个已知大小的数组指针。在 C++ 中,使用引用可能更好,因为它的行为类似于数组,而不需要对其进行解引用。 - Pete Kirkham
3个回答

5

[4]放在函数名后面,就像在变量定义中放在变量名后面一样:

int (*fn())[4]
{
    return &intArray;
}

由于这是非常晦涩的语法,容易让每个读者感到困惑,如果你没有任何特殊原因需要使用指向数组的指针,我建议将数组作为一个简单的int*返回。

你还可以通过typedef简化函数定义:

typedef int intarray_t[4];

intarray_t* fn() { ... }

@Will:它可以在gcc v3.4.3和v4.4.1以及Sun cc v5.9上运行,所以我认为这是在线编译器的问题。 - sth
你可以使用typedef来简化语法问题。但实际上,最好返回int **,甚至是int *。 - user3458
@Arkadiy:你返回了一个指向四个整数数组的指针? - Will
这正是我想要的 - 谢谢。我没有任何理由,只是在摆弄。我想到做:int(*a)[4] = fn2(); for(int i = 0; i < (sizeof(*a) / sizeof((*a)[0])); ++i) (*a)[i] = ...;有两个好处。(1) 数组大小成为类型的一部分,因此您不会轻易越过其边界。(2) 您不再需要传递数组大小。但是我同意,语法很糟糕,必须在各个地方引用和解引用 "int (*fn())[4]"!尽管如此,我认为在那部分之后审慎地添加注释可能意味着收益超过了问题。 - Kay
假设您不希望删除数组,请改用引用。int (&a)[4] = fn2(); for (int i = 0; i < (sizeof(a) / sizeof((a)[0])); ++i) a[i] = 8; - Pete Kirkham

2

不允许从函数中返回数组,但有解决方法

例如,以下代码:

int fn()[4] {
   ...

这段代码在各种在线编译器上都无法通过;我在被认为是最符合标准的编译器之一的Comeau在线编译器上尝试了一下,即使在放松模式下也会显示:

error: function returning array is not allowed

另一位发帖者建议返回int**;这样做是可行的,但要非常小心,确保返回的是堆分配的内存而不是栈分配的内存。


1

你可以返回 int**


或者void*。它们都包含有关数组大小的信息。 - Pete Kirkham

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接