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

时间:2015-05-28 16:16:56

标签: 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) *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;
}

基本上我有一个函数返回指向数组的指针,我想打印这个数组的内容。我希望这段代码可以打印四个数组:

[1,2,3,4,5]  
[2,3,4,5,6]  
[3,4,5,6,7]  
[4,5,6,7,8]  

然而,印刷阵列的内容似乎是随​​机的。我很乐意提示代码有什么问题。

2 个答案:

答案 0 :(得分:3)

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

int result[ARR_SIZE];生命周期受five范围的限制,因此最终会被释放。拿它的地址并归还它不会延长它的寿命。

除隐藏错误外,此decltype(result) *final_arr=&result;实际上没有做任何事情。您可以跳过它并编写return &result;,这很可能会严重扰乱编译器而不能编译代码。

答案 1 :(得分:2)

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