針對main函數的運行時stack的分析,main函數stack

來源:互聯網
上載者:User

針對main函數的運行時stack的分析,main函數stack
針對main函數的運行時stack的分析

                     這裡需要特殊說明的是運行環境是64-bits的Ubuntu.編譯器是gcc



測試用代碼:

int main(int argc,char* argv[]){int array[10];array[0] = 10; array[9] = 9; return 0;}


利用GDB調試這段代碼。我們來觀察分析main函數的棧





分析&argc 和&argv可以知道當前main函數棧的使用方式


64bits 的機器。指標長度是64bits,即8byte.

由於位元組對其的緣故,這裡stack的運行時狀態是這樣的

 



提示: 如果%rbp 被破壞,那麼將導致call main無法返回,接著core dump

這篇blog意在為後面的CSAPP lab0做鋪墊~

http://blog.csdn.net/cinmyheart/article/details/39138915







c++剛運行到main就Stack overflow

可能形成死迴圈,你往棧裡一直壓資料,棧大小是很有限的,溢出了

下面這句後面的break可能根本沒有執行到.
if(temp1==standard)break;
你在改一下看看
if(temp1==standard)
{
cout<<"braak";
break;
}
你看看,是在中斷前溢出還是中斷後溢出.
再就是其它地方設斷點,調試一下就看出來了

同理,按此法向下繼續,你很快就能找到出問題的地方.
 
簡述main函數的作用

[編輯本段]main函數概述
日常生活中,要完成一件複雜的功能,我們總是習慣把“大功能”分解為多個“小功能”以實現。在C++程式的世界裡,“功能”可稱呼為“函數”,因此“函數”其實就是一段實現了某種功能的代碼,並且可以供其它代碼調用。
一個程式,無論複雜或簡單,總體上都是一個“函數”;這個函數就稱為“main 函數”,也就是“主函數”。比如有個“做菜”程式,那麼“做菜”這個過程就是“主函數”。在主函數中,根據情況,你可能還需要調用“買菜,切菜,炒菜”等子函數。
[編輯本段]main函數的參數
C程式最大的特點就是所有的程式都是用函數來裝配的。main()稱之為主函數,是所有程
序啟動並執行入口。其餘函數分為有參或無參兩種,均由main()函數或其它一般函數調用,若調用
的是有參函數,則參數在調用時傳遞。
main()
{
...
y1=f1(x1,x2);
...
}
f1(int a,int b)
{
....
Y2=f2(x3,x4);
....
}
f2(int m,int n)
{
....
.....
}
在前面課程的學習中,對main()函數始終作為主調函數處理,也就是說,允許main()調用
其它函數並傳遞參數。事實上,main()函數既可以是無參函數,也可以是有參的函數。對於有
參的形式來說,就需要向其傳遞參數。但是其它任何函數均不能調用main()函數。當然也同樣
無法向main()函數傳遞,只能由程式之外傳遞而來。這個具體的問題怎樣解決呢?
我們先看一下main()函數的帶參的形式:
main(argc,argv)
int argc,char *argv[];
{
.....
}
從函數參數的形式上看,包含一個整型和一個指標數組。當一個C的來源程式經過編譯、連結後,會產生副檔名為.EXE的可執行檔,這是可以在作業系統下直接啟動並執行檔案,換句話說,就是由系統來啟動啟動並執行。對main()函數既然不能由其它函數調用和傳遞參數,就只能由
系統在啟動運行時傳遞參數了。
在作業系統環境下,一條完整的運行命令應包括兩部分:命令與相應的參數。其格式為:
命令參數1參數2....參數n¿
此格式也稱為命令列。命令列中的命令就是可執行檔的檔案名稱,其後所跟參數需用空格分隔,並為對命令的進一步補充,也即是傳遞給main()函數的參數。
命令列與main()函數的參數存在如下的關係:
設命令列為:program str1 str2 str3 str4 str5
其中program為檔案名稱,也就是一個由program.c經編譯、連結後產生的可執行檔program.exe,其後各跟5個參數。對main()函數來說,它的參數argc記錄了命令列中命令與參數的個數,共6個,指標數組的大小由參數argc的值決定,即為char*argv[6],指標數組的取值情況6-15所示。
數組的各指標分別指向一個字串。應當引起注意的是接收到的指標數組的各指標是從命令列的開始接收的,首先接收到的是命令,其後
才是參數。
下面用執行個體來說明帶參數的main()函數的正確使用。
[例6-29] 利用圖形庫函數繪製一個變化的環。它是把一個半徑為R 1的圓周分成n份,然
後以每個等分點為圓心,以R s為半徑畫n個圓(關於作圖的詳細理論本教材第9章第1節作了專
門介紹,這裡只作簡單分析)。利......餘下全文>>
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.