局部变量问题

程序输出为:

25

10

1660148680//不确定数

首先一个全局指针pPoint;在函数Func()中指向了Number的地址,同时Number被赋值为25,然而在main函数中调用函数Func(),然后输出*pPoint的值,也就是原本指向Number的值,但是我们知道Number是函数Func()中的局部变量,当函数结束时,就释放了Number的存储空间。或者说因为Number是局部变量存放在栈中,当函数结束时,栈就释放了函数所申请的栈:

如下反汇编:

进入函数,首先将ebp入栈,即保存函数的入口地址(栈指针),然后通过esp指向栈顶在进行不断的移动,

也就是说是入栈或者出栈是通过栈顶指针来进行不断的移动,然后对栈中的值的不断覆盖和写入。

 

当Func()函数调用结束后,栈顶指针返回到了原来的位置,对于在Func()函数中新开辟的栈的值还在,只是栈顶指针已经移走了(同时需注意的是栈是由高位向低位增长的),对于函数中新开辟的地址空间的值肯定是还在的,而且也暂时还没被覆盖。现在当要调用输出流输出*pPoint的时候,也就是pPoint指向地址的值,虽然函数是结束了,但是指针指向的地址还是在的(地址一直都在),然后解引用访问地址上的值的时候,由于这时候刚调用完函数Func(),对于函数中原先开放的栈还没有被其他的变量或者什么的覆盖,所以能够输出25。这就解释了为什么第一个输出是25的原因。

然而,为什么第二个却输出的是10呢?这就是因为现在pPoint是野指针了(随便指向那块地址的值),对于输出10那是刚巧,那片地址空间被分配给了i,通过分别输出Number和i的地址可以发现他们的地址是相同的。

 

 

最后再次输出指针pPoint的时候,可以看到变成了一个随机数,也就是说,这时这块地址空间又被其他的东西占用了,至于被什么占用那就看栈把那地址分配给谁了……

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值