#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;
}
這個(gè)程序輸入在VC下是一直是showMe,死循環(huán)
結(jié)果是:不停的調(diào)用showme()。
showme
showme
showme
showme
showme
showme
showme
。。。
請(qǐng)教了同學(xué),找出了答案
這個(gè)是自動(dòng)變量存儲(chǔ)棧,傳給函數(shù)的參數(shù)是以棧這種結(jié)構(gòu)來開辟暫時(shí)存貯空間的。現(xiàn)在的C++編譯器處理函數(shù)參數(shù)后按照參數(shù)表的順序往臨時(shí)開辟的棧空間中壓入數(shù)據(jù),以這段程序來說~先壓進(jìn)value,再壓進(jìn)value1,而函數(shù)內(nèi)部語句的執(zhí)行代碼也是以棧的形式存貯的
ShowMe();這段程序的執(zhí)行代碼是最先被壓入函數(shù)的執(zhí)行棧中的,int temp=add(10,12); 地址要高于ShowMe();這個(gè)函數(shù)的地址
,int temp=add(10,12); 把地址又改回里低地址。
局部函數(shù)的參數(shù)
函數(shù)內(nèi)代碼的執(zhí)行,都是按照棧這種方法進(jìn)行的
這道題目不能說沒有意思,主要考察了基礎(chǔ)的匯編以及堆棧知識(shí)。
int* value2=pAdd-1;
*value2=*value2-0x0e;
這里明顯修改了add函數(shù)返回地址,剛恰好showme()的入口地址,所以就
add->showme->add->showme ...
不停的調(diào)用下去。