C++ C++;指向数组返回类型的指针

C++ C++;指向数组返回类型的指针,c++,arrays,pointers,C++,Arrays,Pointers,我有这样一个代码: #include <iostream> using std::cout; const int ARR_SIZE=5; int arr[ARR_SIZE]; int (*five(int first))[ARR_SIZE] { int result[ARR_SIZE]; for (int i=0;i!=5;++i) { result[i]=(i+first); } decltype(result) *fi

我有这样一个代码:

#include <iostream>
using std::cout; 

const int ARR_SIZE=5;
int arr[ARR_SIZE];

int (*five(int first))[ARR_SIZE]
{
    int result[ARR_SIZE];
    for (int i=0;i!=5;++i)
    {
        result[i]=(i+first);
    }
    decltype(result) *final_arr=&result;
    return final_arr;
}

template <typename T>
void print_arr(T *beg, T *end)
{
    cout << "[";
    for (;beg!=end;++beg)
        cout << *beg << ", ";
    cout << "]" << endl;
}

int main()
{
    decltype(arr) *a;
    for (int i=1;i!=5;++i)
    {
        a=five(i);
        print_arr(std::begin(*a),std::end(*a));
    }

    return 0;
}

然而,打印阵列的内容似乎是随机的。如果能给我一个关于代码错误的提示,我将不胜感激。

您的代码会产生未定义的行为-从
five
函数返回悬空指针-这意味着您正在返回指向对象的指针,它是在堆栈上分配的。

您的代码产生未定义的行为-从
five
函数返回悬空指针-这意味着您返回的指针指向堆栈上分配的对象。

您将进入未定义的行为。在
five
中返回一个悬空指针

int结果[ARR_SIZE]生命周期受到
5
范围的限制,因此它最终会被释放。记下它的地址并返回它不会延长它的寿命


decltype(result)*final_arr=&result实际上除了隐藏错误之外什么都不做。您可以跳过它并编写
return&result这很可能会严重影响编译器,使其无法编译代码。

您将进入未定义的行为。在
five
中返回一个悬空指针

int结果[ARR_SIZE]生命周期受到
5
范围的限制,因此它最终会被释放。记下它的地址并返回它不会延长它的寿命


decltype(result)*final_arr=&result实际上除了隐藏错误之外什么都不做。您可以跳过它并编写
return&result
这很可能会让编译器非常不安,以至于无法编译代码。

看到
decltype
和糟糕的原生C数组在同一段代码中被糟糕地使用,这是一个有趣的并列现象。@Puppy不过,你必须同意
int(*five(int first))[ARR\u SIZE]
是一种有趣的创造性语法。=)伙计们,我正在努力学习C++作为一种新的语言,来自Python/F,即高级语言。我只是想,出于性能原因,知道如何返回更多的低级构造(如C数组)可能会更好。因为我在C++中寻找的是性能增益(在科学计算中)。因此,知道如何从函数返回数组还是不错的。看到
decltype
和糟糕的原生C数组在同一段代码中被糟糕地使用,这是一个有趣的并列现象。@Puppy不过,你必须同意
int(*five(int first))[ARR_SIZE]
是一种有趣的创造性语法。=)伙计们,我正在努力学习C++作为一种新的语言,来自Python/F,即高级语言。我只是想,出于性能原因,知道如何返回更多的低级构造(如C数组)可能会更好。因为我在C++中寻找的是性能增益(在科学计算中)。因此,知道如何从函数返回数组还是不错的。谢谢。那么有没有办法从函数返回数组呢?我的意思是返回数组,而不是简单地填充作为参数传递的数组。通过值返回,并在RVO上计数。否则,您只能返回一个动态分配的对象,然后决定它的生存时间,无论好坏。谢谢。那么有没有办法从函数返回数组呢?我的意思是返回数组,而不是简单地填充作为参数传递的数组。通过值返回,并在RVO上计数。否则,您只能返回一个动态分配的对象,然后决定它的生存时间,无论好坏。
[1,2,3,4,5]  
[2,3,4,5,6]  
[3,4,5,6,7]  
[4,5,6,7,8]