c++ - 为什么 C++ 中函数指针返回的数据过期并且无法访问数组的所有元素?

标签 c++ arrays function-pointers

当我在下面编译时,只有第一个“cout”工作正常。

void * functionname()
{
int i[3]={1,2,3};
int *p = i;
return p;
}

int main()
{

int *p = new int[3];
p= (int *)functionname();

std::cout<<p[1]<<"\n";
std::cout<<p[1]<<"\n";
std::cout<<p[2]<<"\n";
std::cout<<p[2]<<"\n";
std::cout<<p[3]<<"\n";
std::cout<<p[3]<<"\n";
delete [] p;
return 0;
}

你能说说是什么问题吗?

最佳答案

数组i是函数的局部。当函数返回时它会死掉,给你留下一个悬垂的指针。最好返回 std::array .

std::array<int, 3> functionname()
{
  return std::array<int, 3>{{1,2,3}};
}

这样,调用者就得到了数组的拷贝,就没有问题了。在您开始担心复制的成本之前,请注意编译器通常会省略拷贝,因此只会创建一个数组。

如果您需要访问底层数据 block ,您可以使用 theArray.data()&theArray[0] .这些为您提供指向第一个元素的指针。

注1:如果你没有C++11支持,你可以使用std::tr1::array来自 <tr1/array> header 。如果没有,请查看 boost::array ,或推出您自己的数组类。

注意 2:如果您想要一个大小仅在运行时已知的数组,请使用 std::vector相反。

关于c++ - 为什么 C++ 中函数指针返回的数据过期并且无法访问数组的所有元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19995302/

相关文章:

c++ - 为什么多线程更新数组没有加速

c++ - 单链表,节点插入最低到最高节点值的问题

arrays - 删除具有相同第一列和最小第二列的行

C# 成员方法作为静态方法 ("reversed extension method")

c - 这些函数类型定义是什么意思?

javascript - JavaScript 中的作用域和闭包问题

c# - 使用某种类型的图表来可视化我的小型 C 程序的最佳方法是什么?

c++ - 即时返回函数调用会编译为 "nop"指令吗?

php - 列出数组 php 中的数字

Javascript - 获取数组中数组最大和的最佳方法