函數參數地址和返回地址的關係

來源:互聯網
上載者:User

 

列印出i到j之間全部整數,不可用迴圈及遞迴。void foo(int i, int j){ printf("%d/n", i++); if(i<=j) *(unsigned long*)(&i-1) -= 5;} int main(int argc, char* argv[]){              foo( 0 , 2 ) ;              printf("foo done/n");              return 0;}以下是我的理解:

高地址
參數j
參數i
函數的返回地址
局部變數
低地址
    <-- 即函數foo的返回地址,內容為調用foo函數的下一條指令的地址   我們可以看到函數的返回地址為第一個參數的地址減去4個位元組。我們用__rtnaddr 來代替函數的返回地址。即__rtnaddr = (int)&first_parameter – 4 ; 知道這些基本知識後,我們就可以來解答了調用foo(0, 2)後,函數的返回地址為printf(“foo done/n”); 指令的地址在foo運行過程中,將函數的返回地址減去5。我們又知道調用foo函數,實際上是產生一個call指令,格式為E8 0xXXXXXXXX ( 1個指令位元組,4個位移量位元組)所以將foo函數的返回地址減去5後,導致的效果是:在foo函數執行結束後,將導致call foo再次執行。從而使一個Recursive調用。最後一個foo被調用後,由於沒有修改返回地址,所以foo執行後printf(“foo done/n”);被執行,整個函數運行結束。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.