1. 程式人生 > >C語言的內存四區模型和函數調用模型

C語言的內存四區模型和函數調用模型

堆區 函數傳遞 字符串 賦值 上進 自動 比較 代碼區 靜態區

首先是操作系統將代碼程序加載到內存中

然後將內存分為4個區

棧區,程序的局部變量區,函數傳遞的參數,由編譯器自動進行內存資源的釋放。

堆區,動態內存申請,如果不手動釋放內存,則這塊內存不會進行析構。

全局區,靜態區,常量區(字符串存放的位置),程序結束後,有操作系統釋放

代碼區,存放函數體的二進制代碼。

最後,操作系統找到main函數的入口,就開始代碼的執行。

一般內存四區中的棧的開口方向是向下的。為什麽要這樣設計呢,因為設計棧的方向向下,可以給應用程序設定棧的大小,這樣就可以避免棧溢出。

不管棧是開口向上還是開口向下,BUFF的增長方向都是向上的。可以通過代碼測出來。

如果棧的開口方向向下,那麽BUFF的基址在下面,如果棧的開口方向向上,BUFF的基址也在下面,也就是說,不管棧的開口方向朝那裏,BUFF的基址都在下面,

函數的調用模型:

在操作系統調用main函數的時候,會將main函數的返回地址和參數入棧,然後開始直行main函數,如果在main函數中調用了其他函數,會先將main函數的運行狀態入棧,然後將被調用函數的返回值入棧,被調用函數的參數入棧,然後去執行被調用函數,如果還有其他調用函數,過程也是類似的。

在main函數中分配的內存,被調用函數是可以使用的。

main函數可以在棧上,堆上,全局區上進行分配內存,這些內存是可以被函數中被調用函數使用的。

而在被調用函數中棧上分配的內存,不能被主調函數使用,像堆上,還有全局區上分配的內存,都可以供主調函數使用,通過間接賦值的方式將內存的首地址傳遞出來就可以了。

這些都是比較容易理解的內容

C語言的內存四區模型和函數調用模型