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

C++ pointer to array return type

本文关键字:c++ 指针 返回类型 数组      更新时间:2023-10-16

我有一个这样的代码:

#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]  

然而,打印数组的内容似乎是随机的。

如果你能告诉我代码有什么问题,我将不胜感激。

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

int result[ARR_SIZE];的生命周期受five作用域的限制,因此在最后被释放。获取它的地址并返回它并不能延长它的寿命。

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

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