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]