首页 > 其他分享 >函数指针+返回数组指针遇到的坑的记录

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

时间:2023-01-25 18:11:07浏览次数:42  
标签:返回 arr int 数组 print 函数指针 指针

在手熟函数指针时,偷懒用了前面测试返回数组指针写的函数,想着比书上更复杂可以加深理解,没想到碰上很傻的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

相关文章

  • JavaScript学习笔记—数组的解构赋值
    constarr=["孙悟空","猪八戒","沙和尚"];let[a,b,c]=arr;//解构赋值console.log(a,b,c);//孙悟空猪八戒沙和尚let[d,e,f,g]=["唐僧","白骨精",......
  • JavaScript 数组合并
    JavaScript中有多种方法可以将多个数组合并成一个数组。1、使用Array.prototype.concat()合并:concat()方法可以将多个数组合并成一个新数组。letarr1=[1,2,3];......
  • JavaScript 数组去重
    JavaScript中有多种方法可以实现数组去重,下面是几种常用的方法:1、使用Set去重:Set数据结构中不能有重复元素,可以将数组转成Set类型,再转回数组。letarr=[1,2,3,4,......
  • C++指针类型的局部变量初始化
    编译器一般不会对一般变量进行初始化,当然也包括指针。所以负责初始化指针变量的只有程序员自己。使用未初始化的指针是相当危险的。因为指针直接指向内存空间,所以程序员很......
  • 代码随想录 | Day6 | LC 349. 两个数组的交集、202. 快乐数
    题349.两个数组的交集解法1set去重、contains比较classSolution{publicint[]intersection(int[]nums1,int[]nums2){Set<Integer>set1=newH......
  • JS数组的常用方法
    join()(数组转字符串)数组转字符串,方法只接收一个参数:即默认为逗号分隔符()。<script> vararr=[1,2,3,4]; console.log(arr.join());//1,2,3,4 console.log(arr.join......
  • 【奇妙的数据结构世界】 用经典例题对数组进行全面分析 | C++
    ​​​​​​第八章  数组:::hljs-center目录第八章数组●前言●一、数组是什么?1.简要介绍2.具体情况●二、数组典型例题——一维&二维&三维1.一维数组......
  • TS:菜单数组转树形,支持多级(递归)
    方法一import{menus}from'./menus.ts'functionlistToTree(list:any=[],options={},data=null){const{rootWhere,childsWhere,addChilds}=Obj......
  • 02 数组的声明和创建
    数组的声明和创建代码packagecom.zhan.base04Array;publicclassTest02{//变量的类型变量的名字=变量的值:定义一个变量且赋值//数组的类型......
  • 【LeetCode哈希表#2】两个数组的交集(Set+数组)
    两个数组的交集力扣题目链接(opensnewwindow)题意:给定两个数组,编写一个函数来计算它们的交集。说明:输出结果中的每个元素一定是唯一的。我们可以不考虑输出结果的......