【C++指针】函数返回指针类型 与 函数返回英语类型(关于获取局部变量的操作)

news/2024/11/29 2:29:19/

错误示范

#include <bits/stdc++.h>
using namespace std;int* RetPtr(void) {							//函数返回指针类型int tempData1 = 1;					//函数执行完后,这个变量的生命周期结束,变量的内存被系统收回cout << "第一个函数中值的地址为:" << &tempData1 << endl;//Output:第一个函数中值的地址为:008FFD9Creturn &tempData1;					//返回这个局部变量的地址(地址即指针)
}int& RetQuote(void) {						//函数返回引用类型int tempData2 = 2;cout << "第二个函数中值的地址为" << &tempData2 << endl;return tempData2;
}int main(void) {int* getP;								//指针可以不初始化,暂时作为为野指针getP = RetPtr();						//指针类型的变量接收指针类型的返回值cout << "tempData1的值为:" << *getP << endl;// 1-1//Output:tempData1的值为:1/* 1-1 这句代码很玄学:虽说 第一个函数 确实可以返回一个 地址值(即在 函数调用期间 存放 tempData1这个局部变量 的地址),(在函数执行完后,tempData1这个局部变量 的内存应该被系统收回,即tempData1应该从tempData1所在的地址上消失即 tempData1所在的地址 现在应该是没存任何值的)但是 解引用这个地址还是获得了 这个局部变量的值,这就很抽象!!!同时报了个警告:warning C4172: 返回局部变量或临时变量的地址: tempData1*/cout << "再次解引用" << *getP << endl;// 2-1//Output:2040637688/* 分析 2-1 这句代码的结果显然,这个值是有问题的,说明在 1-1代码结束 tempData1 的生命周期才结束*/cout << "对 tempData1 进行修改后的值:" << (*getP)+10 << endl;// 2-2//Output:对 tempData1 进行修改后的值:2040637698/* 分析 2-2 这句代码的结果2-1这句代码 如果替换成 2-2这句代码 ,效果一样,也会返回一个很奇怪的值*//* 针对 1-1 2-1 2-2 这三句代码得出结论:在函数被调用,执行完后,函数局部(里) 定义的 变量仍会存在一定时间*/cout << "tempData1的地址(指针)值:" << getP << endl;		//对地址(指针)的解引用,获得指针所指对象的值//Output:tempData1(指针)值:008FFD9C,和tempData1的地址值一样,说明 RetPtr() 确实返回了tempData1的地址值/*所以不建议使用 “函数返回指针” 来获取 函数中使用的局部变量!!!*//*下面这种也是不可行的*///int& getQ;							//这样写是错的int& getQ = RetQuote();					//引用类型的变量必须初始化cout << "tempData2的值为:" << getQ << endl;/* 和第一种一样的情况还是获得了局部变量的值*/cout << "再次获得tempData2的值:" << getQ << endl;/* 和第一种一样的情况无法获取这个值,即地址上的值已经消失了*/return 0;
}

正确解决办法

#include <bits/stdc++.h>
using namespace std;int& RetQuote(void) {						//函数返回引用类型int tempData2 = 2;cout << "第二个函数中值的地址为" << &tempData2 << endl;//Output:00D6FDE4return tempData2;
}
int main(void) {int copyTempData;copyTempData = RetQuote();						//强行拿 整形变量 接收 引用类型的返回值cout << "tempData2的值:" << copyTempData << endl;//Output:tempData2的值:2cout << "对copyTempData引用(看看是不是tempData2的地址值):" << &copyTempData << endl;//对copyTempData引用(看看是不是tempData2的地址值):00D6FEC8/* 分析 &copyTempData != &tempData2 的原因“int copyTempData;”				:	为新变量copyTempData 开辟一个新的空间“copyTempData = RetQuote();”	:	copyTempData = tempData2;//这是个伪代码*/cout << "对copyTempData进行修改后的值:" << copyTempData + 10 << endl;//对copyTempData进行修改后的值:12return 0;
}

http://www.ppmy.cn/news/1183613.html

相关文章

C++编译与运行:其三、虚函数、虚表和多态

对于非虚非静态成员函数的调用&#xff0c;是在编译期间就明确了的。简单地说&#xff0c;调用的时候将this指针传入函数&#xff0c;后面根据this指针指向的对象执行程序。但是在虚函数中却不一样。 一、虚函数执行原理&#xff1a;虚函数指针和虚函数表 虚函数表&#xff1…

使用 Pyro 和 PyTorch 的贝叶斯神经网络

一、说明 构建图像分类器已成为新的“hello world”。还记得当你第一次接触 Python 时&#xff0c;你的打印“hello world”感觉很神奇吗&#xff1f;几个月前&#xff0c;当我按照PyTorch 官方教程并为自己构建了一个运行良好的简单分类器时&#xff0c;我也有同样的感觉。 我…

Geeker-Admin中ProTable表格分页之自定义接口页码、尺寸参数

最近挖了个新玩意儿&#xff0c;Geeker-Admin&#xff0c;看起来感觉挺好。 鼓捣了半天搞定了与服务端的API接口对接&#xff0c;但在表格分页的时候又遇到了问题&#xff0c;系统默认是pageNum/pageSize这两个参数名用来分页&#xff0c;而服务端是current/size&#xff0c;开…

C++ 学习系列 -- 标准库常用得 algorithm function

一 前言 c 标准库中提供了许多操作数据结构&#xff1a;vector、list、deque、map、set 等函数&#xff0c;学习并了解这些常用函数对于我们理解 c 的一些设计模式有着重要的作用。 二 常用的 algorithm function 源码 源代码位置&#xff1a; bits/stl_algo.h 1. accumu…

【ROS入门】机器人导航(仿真)——导航实现

文章结构 建图 SLAM编写gmapping节点相关launch文件执行 地图服务 map_server地图保存节点 map_server地图服务 map_server 定位 amcl编写amcl节点相关的launch文件编写测试launch文件执行 路径规划 move_basemove_base与代价地图碰撞算法 move_base使用launch文件配置文件laun…

git config pull.rebase false

git pull 默认使用merge 可以使用 git pull --rebase 命令使用rebase 或者配置 git config pull.rebase true 使 git pull命令执行 git pull --rebase git config pull.rebase false 的作用是设置 Git 在执行 git pull 命令时默认使用 merge 而不是 rebase。 git pull 命…

Day 11 python学习笔记

模块 内置模块 random random&#xff1a;随机数模块 我们可以在解释器中看到其蕴含的方法 接下来我解释一些常用的方法&#xff1a; random.random( ) random.random( ) 返回0-1的随机数 [0,1) >>> random.random() 0.364183511476754 random.randint(n,m) r…

新的iLeakage攻击从Apple Safari窃取电子邮件和密码

图片 导语&#xff1a;学术研究人员开发出一种新的推测性侧信道攻击&#xff0c;名为iLeakage&#xff0c;可在所有最新的Apple设备上运行&#xff0c;并从Safari浏览器中提取敏感信息。 攻击概述 iLeakage是一种新型的推测性执行攻击&#xff0c;针对的是Apple Silicon CPU和…