Wonderland of C++

不要做一个浮躁的人

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  13 随笔 :: 1 文章 :: 0 评论 :: 0 Trackbacks

 

#include <stdio.h> 
void ShowMe() 

  printf(
"showme\n"); 

int add(int value,int value1) 

  
int * pAdd=&value; 
  
int* value2=pAdd-1
  
*value2=*value2-0x0e
  
return (value+value1); 

/* 
*/ 
int add3v(int v,int v1,int v2) 

  
return (v+v1+v2); 

int main(int argc, char* argv[]) 
{    ShowMe(); 
      
int temp=add(10,12); 
      
int te=add3v(3,4,5); 
        printf(
"%d,%d",temp,te); 

        
return 0
}

这个程序输入在VC下是一直是showMe,死循环
结果是:不停的调用showme()。
showme
showme
showme
showme
showme
showme
showme
。。。


请教了同学,找出了答案
这个是自动变量存储栈,传给函数的参数是以栈这种结构来开辟暂时存贮空间的。现在的C++编译器处理函数参数后按照参数表的顺序往临时开辟的栈空间中压入数据,以这段程序来说~先压进value,再压进value1,而函数内部语句的执行代码也是以栈的形式存贮的
 ShowMe();这段程序的执行代码是最先被压入函数的执行栈中的,int temp=add(10,12); 地址要高于ShowMe();这个函数的地址
,int temp=add(10,12); 把地址又改回里低地址。
局部函数的参数
函数内代码的执行,都是按照栈这种方法进行的

这道题目不能说没有意思,主要考察了基础的汇编以及堆栈知识。
int* value2=pAdd-1;
*value2=*value2-0x0e;

这里明显修改了add函数返回地址,刚恰好showme()的入口地址,所以就
add->showme->add->showme ...
不停的调用下去。




Robert Su 2008-08-08 18:14 发表评论

文章来源:http://www.blogjava.net/babymouse/archive/2008/08/08/220960.html
posted on 2008-08-08 18:14 Robert.Su 阅读(454) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航:   博客园   博客园最新博文   博问   管理