程序输出为:
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的时候,可以看到变成了一个随机数,也就是说,这时这块地址空间又被其他的东西占用了,至于被什么占用那就看栈把那地址分配给谁了……