指向栈的指针引发的问题

原创 2006年05月29日 17:45:00

#include <iostream.h>

void f1( int *& j)
{
    int l=20;
    int *k=&l;
    j=k;
}
 
void any_function_use_local_variables()
{
    int a,b,c;
    a=b=c=100;
}

int main()
{
    int i=10;
    int *j=&i;
    f1(j);
    cout<<*j<<endl;
    any_function_use_local_variables();
    cout<<*j<<endl;
    return 0;
}

 

不编译程序,猜猜它的输出结果是什么?

不仔细分析这个程序就会很容易错误地得出以下结果:
20
20
而实际输出的结果是:
20
100
觉得有点莫名奇妙了是吧?

不要紧,下面我来分析一下这个程序:
main主函数中声明了指针j,并将它指向i的地址。
f1函数将指针j的引用当作参数传入,压入栈,函数体f1返回前的栈如下图所示:

┃          ┃
┣━━━━━┫
┃   k=&l  ┃
┣━━━━━┫
┃   l=20  ┃<---j=k
┣━━━━━┫      ┏━━┓
┃  参数j  ┃---->┃  j ┃
┣━━━━━┫      ┗━━┛
┃ 中断入口 ┃
┣━━━━━┫
┃          ┃

由于传入的是j的引用,函数返回后j仍指向栈中l的空间。而函数返回时并没有修改栈中各个单元的值,只是将指针指向中断入口前,因此这时*j的值为20。
当调用any_function_use_local_variables()时,原来l的空间将被b的值覆盖,所以返回时再次输出*j的值时就变成100了,栈如下:
┃          ┃
┣━━━━━┫
┃  c=100  ┃
┣━━━━━┫
┃  b=100  ┃<---j
┣━━━━━┫
┃  a=100  ┃
┣━━━━━┫
┃ 中断入口 ┃
┣━━━━━┫
┃          ┃

 

栈中的内容很容易随着函数的调用而发生改变,通过这个例子可以得出,在使用指针时,不要轻易将指针指向栈中的空间,除非你有十成的把握。

栈--进栈,出栈指针修改的顺序问题

策略设计一个顺序栈,附设的top指针有两种策略: 指向当前栈顶元素 指向栈顶上方空位 借助一篇文章深入分析二者的异同。top指向栈顶首先令top指向当前栈顶元素,这样进来一个新的元素时,新元素不能占据...
  • u011240016
  • u011240016
  • 2016年10月02日 13:50
  • 2245

返回指向局部变量的指针或引用

返回局部变量没问题 如果返回局部变量有问题,函数的意义还有吗? 全局变量还用返回吗?  返回指向局部变量的指针才有问题, 函数退栈之后,局部变量消失, 指针将指向未知区域,所以出现问题。 ...
  • u012317833
  • u012317833
  • 2014年11月04日 08:57
  • 1260

智能指针的死穴 -- 循环引用

C++最新标准C++11中已将基于引用计数的智能指针share_prt收入囊中,智能指针的使用门槛越来越低,不需要使用boost库,我们也能轻松享受智能指针给我们带来的方便。 智能指针,正如它的名字...
  • jfkidear
  • jfkidear
  • 2013年06月05日 21:59
  • 5857

返回指向局部变量的指针或引用的问题

一般的来说,函数是可以返回局部变量的。 局部变量的作用域只在函数内部,在函数返回后,局部变量的内存已经释放了。因此,如果函数返回的是局部变量的值,不涉及地址,程序不会出错。但是如果返回的是局部变量的地...
  • CSDN_wei
  • CSDN_wei
  • 2015年10月26日 12:03
  • 427

C/C++中结构体变量及指向结构体指针变量的内存分配问题

一个结构体变量的指针就是该变量所占据的内存段的起始地址。可以设一个指针变量,用来指向一个结构体变量,此时该指针变量的值是结构体变量的起始地址。指针变量也可以用来指向结构体数组中的元素。 声明...
  • qq_33573235
  • qq_33573235
  • 2017年05月06日 10:38
  • 243

《深入详解VC++》第三者 74页关于this指针指向子类的问题

在第三章的74页中,有这样一行代码:pModuleState->m_pCurrentWinApp = this;作者说,根据C++继承性原理,这个this对象代表的是子类CTestApp实例化的一个对...
  • luoshao20120430
  • luoshao20120430
  • 2013年03月27日 13:11
  • 758

c/c++向函数传递指针并修改其指向的问题

一个非常简单的用来交换两个数的值的函数,可以有若干种写法。 众所周知的错误写法为: #include using namespace std; void swap(int a, int b) { ...
  • bin510729392
  • bin510729392
  • 2016年05月22日 19:52
  • 2028

有关动态创建释放二维数组,以及指向数组的指针问题集合

转载地址:http://blog.sina.com.cn/s/blog_6a0cb8bc0100u49x.html 今天写程序,因为涉及到二维数组的动态创建及释放问题,浏览了...
  • why7819
  • why7819
  • 2014年02月17日 19:39
  • 376

返回指向局部变量的指针或引用的带来的问题讨论

返回局部变量没问题 如果返回局部变量有问题,函数的意义还有吗? 全局变量还用返回吗?  返回指向局部变量的指针才有问题, 函数退栈之后,局部变量消失, 指针将指向未知区域,所以出现问题。 ...
  • jirongzi_cs2011
  • jirongzi_cs2011
  • 2013年08月10日 19:31
  • 6317

返回指向局部变量的指针或引用的带来的问题讨论

返回局部变量没问题 如果返回局部变量有问题,函数的意义还有吗? 全局变量还用返回吗?  返回指向局部变量的指针才有问题, 函数退栈之后,局部变量消失, 指针将指向未知区域,所以出现问题。 ...
  • suyinfan
  • suyinfan
  • 2016年05月10日 12:40
  • 311
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:指向栈的指针引发的问题
举报原因:
原因补充:

(最多只允许输入30个字)