我有这样的代码:
#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]
然而,印刷阵列的内容似乎是随机的。我很乐意提示代码有什么问题。
答案 0 :(得分:3)
您将进入未定义的行为。你在five
中返回一个悬空指针。
int result[ARR_SIZE];
生命周期受five
范围的限制,因此最终会被释放。拿它的地址并归还它不会延长它的寿命。
除隐藏错误外,此decltype(result) *final_arr=&result;
实际上没有做任何事情。您可以跳过它并编写return &result;
,这很可能会严重扰乱编译器而不能编译代码。
答案 1 :(得分:2)
您的代码产生未定义的行为 - 从five
函数返回悬空指针 - 这意味着您将返回指向对象的指针,该指针在堆栈上分配。