C++函数返回局部指针变量
遇到过好几次关于函数返回指针变量问题,有时候是可以的,有时候是不可以的,然后就混乱了。今天研究了下,结果发现原来和内存分配有关。
用下面的例子分析下吧:
char * test()
{
char a[] = "abc";
char * p =a;
return p;
} int main()
{
printf("%s",test());
return ;
}
这段p是局部指针,指向局部数组a,这种情况输出为空或者奇怪字符串。
分析:
a是局部数组,系统为其分配的是栈内存,test()函数一结束,a的生命结束,其所占内存被释放,p也被释放,返回回来的是被释放的内存,输出必然不正确。
char * test()
{
char * p ="abc";
return p;
}
int main()
{
printf("%s",test());
return ;
}
这段输出是"abc"。
为什么这样又是正确的呢?
因为p虽然为局部指针,函数结束,p被释放,但是p指向的并不是栈内存,而是常量存储区,即使函数结束,这段内存存储的仍旧是"abc",所以返回回来的地址是有效的,结果自然是正确的。
再用一个strcpy函数的实现来举例:
char * strcpy(char * strDest,const char * strSrc)
{
assert(strDest != null && strSrc != null);
char * address = strDest;
while(*strDest++ = *strSrc++);
return address;
}
显然,返回的也是局部指针address,并且是正确的。
因为address指向的地址是strDest所指地址,而strDest指向的地址是作为参数传给函数的,所以即便函数结束,释放了address,但返回的地址仍旧是有效的,即目的地址。
总结:返回局部指针时,要依据其指向的地址,在函数退出后是否有效来判断返回是否是想要得到的结果。
C++函数返回局部指针变量的更多相关文章
- 关于C++函数返回局部对象的详细分析
以前一直挺好奇的,C++是怎么在函数内返回一个局部对象的.因为按照我之前的想法,函数返回一个基本类型的值是通过存放到ecx实现的(关于浮点不了解),但是局部对象又是比较大的,很明显不能使用寄存器作为通 ...
- C语言函数返回值和变量类型
前言 最近在刷题,在写矩阵的快速幂的题时,对于返回值是数组的程序,写的十分冗杂.借此机会,重新梳理下C语言中函数的返回值与变量类型的关系. 按照变量的寿命,可以分为三种类型 1.静态变量 寿命从程序开 ...
- C++ 函数返回数组指针的问题
提醒一下:int *func(){int a[10] = {5};return a;}是非法的,因为 a 是局部变量,被申请在系统栈中,局部变量在函数返回后会被销毁,于是你返回的指针指向的是一段已经被 ...
- PHP引用操作以及外部操作函数的局部静态变量的方法
通过引用方式在外部操作函数或成员方法内部的静态变量 下面举个简单的例子,说明三个关于引用方面的问题: 1. 参数引用后函数内进行类型转换同样是地址操作 2. 参数引用后再传递给其他函数时需要再次添加引 ...
- js-fn函数返回一个引用变量的细节
1.直接返回一个字面量对象 function fun1() { return { age:10, name:'adain' } a = fun1(); b = fun1(); b.age = 18 ; ...
- C语言函数指针变量和指针函数以及指针数组
C语言中,一个函数总是占用一段连续的内存区,而函数名就是该函数所占内存区的首地址.我们可以把函数的这个首地址(或称入口地址)赋予一个指针变量,使该指针变量指向该函数.然后通过指针变量就可以找到并调用这 ...
- 用C语言指针作为函数返回值
转载:http://c.biancheng.net/cpp/html/3242.html C语言允许函数的返回值是一个指针(地址),我们将这样的函数称为指针函数.下面的例子定义了一个函数 strlon ...
- C++ —— 返回数组指针的函数 和 返回指向函数的指针的函数
返回数组指针的函数 基础知识:数组不能被拷贝,函数不能返回数组,只能返回数组的指针或者引用. 定义一个 返回数组指针的函数 的方法,以 一个接收参数为 含有10个整型元素的数组的引用 和 返回一个含 ...
- C++函数返回值(02)
对象作为返回值 编译器会将函数栈中的返回值数据拷贝到返回栈中 指针作为返回值 函数的返回值可以是存储某种类型数据的内存地址,称这种函数为指针函数.它们的一般定义形式如下: 类型标识符 *函数名(参数 ...
随机推荐
- iOS之UILabel自适应高度、宽度
下列两条自适应高度和宽度的自定义方法:
- web.py+html+mysql实现web端小系统的问题汇总
利用web.py+html(bootstrap)+mysql实现了一个小型的设备管理系统,在这个过程中遇到很多问题,将问题及解决方案总结如下,有遇到类似问题的同学,希望可以帮到你们. 1.关于中文的编 ...
- Smarty模板函数
1.{$var=...} 这是{assign}函数的简写版,你可以直接赋值给模版,也可以为数组元素赋值. <{$a = 10}><!--赋值语句--> <{$a}> ...
- dojo创建tree
今天介绍dojo目录树的效果,效果如下图: HTML代码如下: <body class="claro"> <div id="rootlessTree&q ...
- C# 获取文件路径
1.C# 获取文件路径:http://www.cnblogs.com/bq-blog/archive/2012/09/01/2666394.html
- 05 Apache Solr: 管理员界面(Admin UI)
为了方便管理员和工程师调整Solr的配置和访问在线文档和其他的帮助,Solr提供了一个Web界面去查看Solr的配置详情,运行查询语句和分析文档字段.这个界面在第三篇里面提到过就是管理员界面 ...
- maven建立本地仓库
maven 建立本地仓库 博客分类: java,maven,nexus 前面我讲到为什么要使用 Maven, Maven 的安装,以及 如何与 IDE 集成等,前面的介绍可以认为是一个 Hello ...
- curl详解
用途说明 curl命令是一个功能强大的网络工具,它能够通过http.ftp等方式下载文件,也能够上传文件.其实curl远不止前面所说的那些功能,大家可以通过man curl阅读手册页获取更多的信息.类 ...
- With语句以及@contextmanager的语法解析
with 语句以及@contextmanager的语法解析 with语句可以通过很简单的方式来替try/finally语句. with语句中EXPR部分必须是一个包含__enter__()和__e ...
- PHP高并发高负载系统架构
PHP高并发高负载系统架构 1.为什么要进行高并发和高负载的研究 1.1.产品发展的需要 1.2.公司发展的需要 1.3.当前形式决定的 2.高并发和高负载的约束条件 2.1.硬件 2.2.部署 2. ...