为什么函数返回数组指针时, 局部变量不会被销毁?

int (*get_arr(int i))[5]{        //第一个*
    int a[5]={0,1,2,3,4};
    return &a;                    //第一个&
}


std::cout<< *( *get_arr(0)  + 1 ) <<std::endl;    //从左向右: 第二个*  第三个*

请问各位,函数执行完以后,a[5]不应该被销毁了吗?
我理解的是, a[5]这个数组, 第一个&取了a[0]-a[4]所在的地址放在那个返回的[5]里.
然后第一个*代表的是解引用还是指针呢?,
第三个*是从get_arr返回的[5]里面取地址变成指针,然后对指针+1操作
然后用第二个*对+1后的指针解引用.
但是a[5]为什么没有被销毁呢?
看了看网上普遍的答案, 是因为a[5]在堆里吗?

注:
C++ primer原话(小的不才,读不懂,各位能否解释一下?):
func(int i)表示调用func函数是需要一个int类型的实参 √
(*func(int i))意味着我们可以对函数调用的结果执行解引用操作 ×
(*func(int i))[10]表示解引用func的调用将得到一个大小是10的数组 ×
int (*func(int i))[10]表示数组中的元素是int类型 × 数组中的元素不应该是指针吗???

阅读 3.2k
1 个回答
请问各位,函数执行完以后,a[5]不应该被销毁了吗?

是的

我理解的是, a[5]这个数组, 第一个&取了a[0]-a[4]所在的地址放在那个返回的[5]里.

取数组的地址,得到并返回了数组的指针

然后第一个*代表的是解引用还是指针呢?,

这个是类型定义,不是运算符。所以应该是指针吧

第三个*是从get_arr返回的[5]里面取地址变成指针,然后对指针+1操作

函数返回的是 int(*)[5] 一个指向数组的指针。
* 解引用,得到一个数组 int[5]
数组自动转换为指向第一个元素的指针 int*
最后对这个指针 +1

然后用第二个*对+1后的指针解引用.
但是a[5]为什么没有被销毁呢?
看了看网上普遍的答案, 是因为a[5]在堆里吗?

已经销毁了。
对已经销毁的指针解引用是一个未定义行为。
未定义行为任何事情都可能发生。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题