关于局部变量回收

 


代码如下:

#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]

你可能感兴趣的:(c,编译器)