在手熟函数指针时,偷懒用了前面测试返回数组指针写的函数,想着比书上更复杂可以加深理解,没想到碰上很傻的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); return &arr; // √ }
估计也是C#写多了+不通其根本,这块形参愣怂没察觉出异常,报错报的是“返回值类型与函数类型不匹配”就以为是返回类型出了问题。好在这块发现的快,其实都是很基础的知识,只是忘得太快了...好在是自己发现的,浪费了时间,但也加深了印象,还是要多手操才能发现问题,毕竟眼睛会了≠手脑会了。
不过也感受到了,内置数组确实不太好用
标签:返回,arr,int,数组,print,函数指针,指针 From: https://www.cnblogs.com/GanSinba/p/17067120.html