Chinaunix首页 | 论坛 | 博客
  • 博客访问: 926872
  • 博文数量: 335
  • 博客积分: 10287
  • 博客等级: 上将
  • 技术积分: 3300
  • 用 户 组: 普通用户
  • 注册时间: 2005-08-08 15:29
文章分类

全部博文(335)

文章存档

2015年(4)

2014年(15)

2013年(17)

2012年(11)

2011年(12)

2010年(96)

2009年(27)

2008年(34)

2007年(43)

2006年(39)

2005年(37)

我的朋友

分类: C/C++

2009-09-27 11:07:45

3、 关于全局变量和局部变量的一个问题

  先不废话了,先看看程序:

#include “iostream.h”

int a=5;

int *example1(int b)

{

a+=b;

return &a;

}

int *example2(int b)

{

int c=5;

b+=c;

return &b;

}

void main()

{

int *a1=example1(10);

int *b1=example2(10);

cout <<”a1=”<<*a1<
cout <<”b1=”<<*b1<
}

输出结果:

a1=15

b1=4135

  *b1怎么会是4135,而不是15呢?是程序的问题?没错吧?

  由于a是全局变量,存放在全局变量的内存区,它一直是存在的;而局部变量则是存在于函数的栈区,当函数example2()调用结束后便消失,是b指向了一个不确定的区域,产生指针悬挂。

  下面是对example1()和example2()的反汇编(用TC++ 3.0编译):

example1():

push bp;入栈

mov bp,sp

mov ax,[bp+04];传递参数

add [00AA],ax;相加

mov ax,00AA ;返回了结果所在的地址

.

.

.

pop bp;恢复栈,出栈

ret;退出函数


example2():

push bp;入栈

mov bp,sp

sub sp,02

mov word ptr [bp-02],0005

mov ax,[bp-02];传递参数

add [bp+04],ax;相加

lea ax,[bp+04];问题就出在这里

.

.

.

mov sp,bp

pop bp;恢复栈,出栈

ret;退出函数

  对比之后看出来了吧?ax应该是存储的是结果的地址。而在example2()中,返回的却是[bp+04]的内容,因此指针指向了一个不确定的地方,由此产生的指针悬挂。example1()中,ax返回了正确的结果的地址。
阅读(399) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~