指向栈的指针引发的问题

原创 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  ┃
┣━━━━━┫
┃ 中断入口 ┃
┣━━━━━┫
┃          ┃

 

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

相关文章推荐

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

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

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

返回局部变量没问题 如果返回局部变量有问题,函数的意义还有吗? 全局变量还用返回吗?  返回指向局部变量的指针才有问题, 函数退栈之后,局部变量消失, 指针将指向未知区域,所以出现问题。 ...

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

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

c++指针复制指向同一个位置问题

今天看primer c++遇到一个问题,希望以后能够解决,暂时保留此贴 #include #include #include using namespace std; class HasPtr...

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

返回局部变量没问题 如果返回局部变量有问题,函数的意义还有吗? 全局变量还用返回吗?  返回指向局部变量的指针才有问题, 函数退栈之后,局部变量消失, 指针将指向未知区域,所以出现问题。 ...

指向对象的指针的函数调用问题(含虚函数和纯虚函数知识)

对象指针不能指向父类对象 执行同样的函数talk,选择执行指针所指定的talk 例如B *pb,则pb只能指向B或者子类对象,执行相同函数时只执行B的talk #include #include u...

多重继承下,不同基类指针指向同一子类对象的地址问题——腾讯一笔试题

多重继承下,不同基类指针指向同一子类对象的地址问题——腾讯一笔试题   2 原文:http://www.haogongju.net/art/1694028 多继承时,父类...
  • dalleny
  • dalleny
  • 2014年08月18日 14:35
  • 1702

一个问题引发的对类成员指针的思考

原题转自《程序员面试宝典》 #include   class A { public:     A() {m_a = 1; m_b = 2;}     ~A() {}     ...

关于ButterKnife8.4引发的空指针问题。。。

今天是最烦躁的一天,成都外面是地狱,五点过就乌漆墨黑,风力强劲,诶。。快冻死了,废话不多说,进入正题,今天做了一个Demo,新闻类的ap,关键点 来了,我选择了butterknife8.4作为我的注解...

memcpy引发的C常见指针问题

本博文为原创,转载请注明出处 http://blog.csdn.net/lux_veritas/article/details/8227386 前段时间调bug,定位了一个字符串赋值的错...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:指向栈的指针引发的问题
举报原因:
原因补充:

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