代码如下:
#include "stdafx.h" #include <stdio.h> int * getValue() { int abb = 111; return &abb; } int main(int argc, char* argv[]) { int xx= (*getValue()); int a =2,b=3,c=4,d=5,e=4,f=5,g=5; printf("[%d]\n",xx); return 0; }
执行结果:
[111]
//你的那个放在一起了...由在那个表达式中,要区分的话很难. //用C++可以很好给你区分出来 #include <stdio.h> int * getValue() { int abb = 111; return &abb; } void fuck() { int xx = 123; } int main(int argc, char* argv[]) { int xx= 0; int* p = getValue(); fuck(); xx = *p; int a =2,b=3,c=4,d=5,e=4,f=5,g=5; printf("[%d]\n",xx); return 0; }
执行结构:
[123]
简言之,就是虽然那个局部变量占用的内存标记为释放了,但是这个地方的治并没有改变,因此你通过指向这个地址的指针进行访问的时候,就会产生局部变量还在的假象。
主调函数栈底用MS表示,
忽略其它信息.
在进入main时
栈为空.
遇到xx的时候,分配一段空间,记为
MS
xx的空间
要调用getValue
于是再分配一段空间,作为函数调用的...也就是说
MS
xx的空间
一些填充信息的空间
函数调用的信息
在getValue中定义变量abb后如下
MS
xx的空间
一些填充信息的空间
函数调用的信息
abb=111
好,现在程序返回
把abb的地址返回了.
栈如下
MS
xx的空间
{
一些填充信息的空间
函数调用的信息
abb
}
{}内表示这一段没有用了,但是信息还在
现在取abb所在的内存的值.
OK,得到111.
放进xx
MS
xx = 111
{
一些填充信息的空间
函数调用的信息
abb
}
可以看出来,虽然没有用,但是值还在...
我在这个中间过程中加一个函数调用...于是就crack掉.
总之,对于{}的内容不要报任何侥幸心理.
编译器完全可以在函数结束的时候...
把{}上的内容设置为其它值...
这样就可以防止你产生这种错误观点了...
#include <stdio.h> int getValue() { int abb = 111; return abb; } void fuck() { int xx = 123; } int main(int argc, char* argv[]) { int xx= 0; int p = getValue(); fuck(); xx = p; int a =2,b=3,c=4,d=5,e=4,f=5,g=5; printf("[%d]\n",xx); return 0; }
执行结构:
[111]