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返回了正确的结果的地址。 
2/2 首页 上一页 1 2 |