遇到过好几次关于函数返回指针变量问题,有时候是可以的,有时候是不可以的,然后就混乱了。今天研究了下,结果发现原来和内存分配有关。

用下面的例子分析下吧:

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++函数返回局部指针变量的更多相关文章

  1. 关于C++函数返回局部对象的详细分析

    以前一直挺好奇的,C++是怎么在函数内返回一个局部对象的.因为按照我之前的想法,函数返回一个基本类型的值是通过存放到ecx实现的(关于浮点不了解),但是局部对象又是比较大的,很明显不能使用寄存器作为通 ...

  2. C语言函数返回值和变量类型

    前言 最近在刷题,在写矩阵的快速幂的题时,对于返回值是数组的程序,写的十分冗杂.借此机会,重新梳理下C语言中函数的返回值与变量类型的关系. 按照变量的寿命,可以分为三种类型 1.静态变量 寿命从程序开 ...

  3. C++ 函数返回数组指针的问题

    提醒一下:int *func(){int a[10] = {5};return a;}是非法的,因为 a 是局部变量,被申请在系统栈中,局部变量在函数返回后会被销毁,于是你返回的指针指向的是一段已经被 ...

  4. PHP引用操作以及外部操作函数的局部静态变量的方法

    通过引用方式在外部操作函数或成员方法内部的静态变量 下面举个简单的例子,说明三个关于引用方面的问题: 1. 参数引用后函数内进行类型转换同样是地址操作 2. 参数引用后再传递给其他函数时需要再次添加引 ...

  5. js-fn函数返回一个引用变量的细节

    1.直接返回一个字面量对象 function fun1() { return { age:10, name:'adain' } a = fun1(); b = fun1(); b.age = 18 ; ...

  6. C语言函数指针变量和指针函数以及指针数组

    C语言中,一个函数总是占用一段连续的内存区,而函数名就是该函数所占内存区的首地址.我们可以把函数的这个首地址(或称入口地址)赋予一个指针变量,使该指针变量指向该函数.然后通过指针变量就可以找到并调用这 ...

  7. 用C语言指针作为函数返回值

    转载:http://c.biancheng.net/cpp/html/3242.html C语言允许函数的返回值是一个指针(地址),我们将这样的函数称为指针函数.下面的例子定义了一个函数 strlon ...

  8. C++ —— 返回数组指针的函数 和 返回指向函数的指针的函数

    返回数组指针的函数 基础知识:数组不能被拷贝,函数不能返回数组,只能返回数组的指针或者引用. 定义一个 返回数组指针的函数 的方法,以 一个接收参数为 含有10个整型元素的数组的引用  和 返回一个含 ...

  9. C++函数返回值(02)

    对象作为返回值 编译器会将函数栈中的返回值数据拷贝到返回栈中 指针作为返回值 函数的返回值可以是存储某种类型数据的内存地址,称这种函数为指针函数.它们的一般定义形式如下:  类型标识符 *函数名(参数 ...

随机推荐

  1. 主从LDAP

    yum -y install compat-openldap必须得安装这个   1:在主上       备份         cp /etc/openldap/slapd.conf /etc/open ...

  2. maven项目报:An error occurred while filtering resources

    maven项目在problem中报: An error occurred while filtering resources   解决方法: 右键项目-maven-update project.. 

  3. iOS 判断设备型号

    + (NSString*)deviceString { // 需要#import "sys/utsname.h" struct utsname systemInfo; uname( ...

  4. NHibernate 映射失败 is not mapped

    1 区分大小写(实体类名) 2 MAP的XML设置为嵌入的资源 3 hibernate.cfg.xml配置添加map的程序集<mapping assembly="Model" ...

  5. Coursera Machine Learning : Regression 多元回归

    多元回归 回顾一下简单线性回归:一个特征,两个相关系数 实际的应用要比这种情况复杂的多,比如 1.房价和房屋面积并不只是简单的线性关系. 2.影响房价的因素有很多,不仅仅是房屋面积,还包括很多其他因素 ...

  6. Android开发工具全面转向Android Studio(1)——准备开发环境

    工欲善其事必先利其器,本文适合Android新手以及用过Eclipse而没用过Android Studio开发Android的老手,众所周知,谷歌是不会再维护和开发ADT了,旧的ADT已经是完全不能渲 ...

  7. Codeforces 734E. Anton and Tree 搜索

    E. Anton and Tree time limit per test: 3 seconds memory limit per test :256 megabytes input:standard ...

  8. WIN2003使用IP安全策略只允许指定IP远程桌面连接

    一,新建IP安全策略 WIN+R打开运行对话框,输入gpedit.msc进入组策略编辑器. 依次打开“本地计算机”策略--计算机配置--Windows设置--安全设置--IP安全策略,在 本地计算机上 ...

  9. 二 Java利用等待/通知机制实现一个线程池

    接着上一篇博客的 一Java线程的等待/通知模型 ,没有看过的建议先看一下.下面我们用等待通知机制来实现一个线程池 线程的任务就以打印一行文本来模拟耗时的任务.主要代码如下: 1  定义一个任务的接口 ...

  10. myeclipse项目编码方式彻底设置

    我们团队6月10号开始做龙泉瓯江青瓷有限公司的ERP系统,采用java语言开发,在开发时我们采用的是java的流行框架struts2,前端脚本都用jquery框架,开发IDE用的是myeclipse, ...