函数指针+返回数组指针遇到的坑的记录

在手熟函数指针时,偷懒用了前面测试返回数组指针写的函数,想着比书上更复杂可以加深理解,没想到碰上很傻的bug还想了半天。

 1 auto getArr3() -> int(*)[5]{
 2     int arr[] = { 1,2,3,4,5 };
 3     return &arr;    //
 4 }
 5 //函数做形参
 6 void print(int(*(*p)())[5]) {
 7     int(*q333)[5] = p();
 8     cout << "带*:" << (*q333)[0] << endl;
 9     cout << "带*:" << (*q333)[1] << endl;
10     cout << "带*:" << (*q333)[2] << endl;
11     cout << "带*:" << (*q333)[3] << endl;
12     cout << "带*:" << (*q333)[4] << endl;
13 
14     for (int i = 0; i < size(*q333); ++i) {
15         cout << (*q333)[i] << endl;
16     }
17 }

bug确实很明显,arr是getArr3的局部变量,所以返回局部变量的引用就是死点,当时也不知道怎么回事盯了半天,print循环里拿元素就是不对,还一个一个试。其实回想一下,之所以让我在print里咬死口,一个是脑子蒙了,再一个是因为p返回的数组,第一次单拿任何一个元素都是对的,但后面就会出错,我就被困在“是不是在循环时数组被调换了”这个陷阱里,之后去喝了杯水才突然醒悟。不过这应该也从侧面体现对象销毁不是即时的吧,还是能取到一个元素才变成悬垂。

之后就是改造函数呗,创建数组当实参,调用函数。又出现了第二个bug:

auto sort(int arr[5]) -> int(*)[5]{
    sort(arr,arr+4);
    return &arr;    //
}

估计也是C#写多了+不通其根本,这块形参愣怂没察觉出异常,报错报的是“返回值类型与函数类型不匹配”就以为是返回类型出了问题。好在这块发现的快,其实都是很基础的知识,只是忘得太快了...好在是自己发现的,浪费了时间,但也加深了印象,还是要多手操才能发现问题,毕竟眼睛会了≠手脑会了。

不过也感受到了,内置数组确实不太好用😂

第三个坑,是对函数指针没有理解到位,在传递实参时还给函数指针里塞实参...

    print(sort(arr));

 

posted @ 2023-01-25 18:08  苏显  阅读(26)  评论(0)    收藏  举报