【问题标题】:Return an array of a known size in C++?在 C++ 中返回一个已知大小的数组?
【发布时间】:2011-03-01 15:16:36
【问题描述】:

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

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

为什么我不能退货:

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

这里,“(*)”中的“)”会产生“语法错误:)”。

【问题讨论】:

  • 您正在传递一个指向已知大小数组的指针。在 C++ 中,引用可能会更好,因为它的行为类似于数组,而不必取消引用。

标签: c++ arrays return


【解决方案1】:

Its not allowed to return arrays from functions, but there are workarounds.

例如下面的代码:

int fn()[4] {
   ...

不被各种在线编译器所接受;我在 Comeau 在线编译器上进行了尝试,它被认为是最符合标准的编译器之一,即使在宽松模式下它也会说:

error: function returning array is not allowed

另一张海报建议返回int**;这会起作用,但要非常小心,返回堆分配的内存而不是堆栈分配的内存。

【讨论】:

    【解决方案2】:

    [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,所以我会说这是那些在线编译器的问题。
    • 您可以使用 typedef 来缓解语法问题。但实际上,你最好返回 int**,甚至是 int *。
    • @Arkadiy:你要返回一个指向四个整数数组的指针?
    • 这就是我所追求的 - 谢谢。我没有这背后的原因,我只是在摆弄。我想到这样做: int(*a)[4] = fn2(); for(int i = 0; i
    • 假设您不希望删除数组,请改用引用。 int ( &a ) [4] = fn2(); for ( int i = 0; i < ( sizeof ( a ) / sizeof ( ( a ) [0] ) ); ++i ) a [ i ] = 8;
    【解决方案3】:

    您可以返回int**

    【讨论】:

    • 或无效*。两者都有关于数组大小的尽可能多的信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-30
    • 1970-01-01
    • 1970-01-01
    • 2011-01-25
    • 2017-05-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多