① c語言內存有幾種分配方式
基本上C程序的元素存儲在內存的時候有3種分配策略:
靜態分配
如果一個變數聲明為全局變數或者是函數的靜態變數,這個變數的存儲將使用靜態分配方式。靜態分配的內存一般會被編譯器放在數據段或代碼段來存儲,具體取決於實現。這樣做的前提是,在編譯時就必須確定變數的大小。 以IA32的x86平台及gcc編譯器為例,全局及靜態變數放在數據段的低端;全局及靜態常量放在代碼段的高端
自動分配
函數的自動局部變數應該隨著函數的返回會自動釋放(失效),這個要求在一般的體系中都是利用棧(Stack)來滿足的。相比於靜態分配,這時候,就不必絕對要求這個變數在編譯時就必須確定變數的大小,運行時才決定也不遲,但是C89仍然要求在編譯時就要確定,而C99放鬆了這個限制。但無論是C89還是C99,都不允許一個已經分配的自動變數運行時改變大小。
所以說C函數永遠不應該返回一個局部變數的地址。
要指出的是,自動分配也屬於動態分配,甚至可以用alloca函數來像分配堆(Heap)一樣進行分配,而且釋放是自動的。
動態分配
還有一種更加特殊的情況,變數的大小在運行時有可能改變,或者雖然單個變數大小不變,變數的數目卻有很大彈性,不能靜態分配或者自動分配,這時候可以使用堆(Heap)來滿足要求。ANSI C定義的堆操作函數是malloc、calloc、realloc和free。
使用堆(Heap)內存將帶來額外的開銷和風險。
② C語言中的代碼段或數據段超過64k怎麼辦,以上兩個能超過1m么
用大模式(Large),並把指針設為far型,這樣可以達到1M內存.
對於超過的源程序,可以視代碼或數據多少將其分解成兩個或多個文件,分開後,盡管源碼己小於64K,但編譯模式還是要選用大模式,這樣編譯生成的OBJ文件,將會讓連接程序把代碼和數據安排在不同的段內,這樣生成的EXE文件在載入時將告訴系統如何裝入.
③ 我們的exe文件中,數據段跟代碼段是交錯在一起還是兩種分開來的
當然是分開的!
以C語言為例,一個可執行程序,是由一個或多個目標文件經過連接生成。目標文件是由每一個C語言源程序(*.c)經過編譯器生成,目標文件(.o)的主要組成部分即代碼段、只讀數據段和讀寫數據段三個段。未初始化數據段、堆和棧不會佔用目標文件的空間。
可執行程序是由各個目標文件經過連接而成。其主體部分依然是代碼段、只讀數據段和讀寫數據段,這三個段由各個目標文件(.o)經過"組合"而成
④ 在C語言中,如何給函數分配內存
不知lz有沒聽說過虛存一說,當源碼被編譯成二進制文件後,其中的變數,函數的虛擬地址,也就是內存空間中的地址就已確定,在運行時,操作系統為其分配物理內存並添加虛擬地址到物理地址的映射。
再說的多一點,一個進程(運行的程序)可分為若干段:代碼段、數據段、堆棧段等,其中函數所操作的空間(也就是局部變數的空間)就位於堆棧段,所謂函數分配內存大小,實際就是堆棧段指針的變化而已。
⑤ C語言中的代碼區什麼意思與數據區什麼區別
代碼區:只讀區域,程序運行過程中無法做任何修改的存儲區域。用於存放代碼和常量。
數據區:可讀可寫區域,程序運行過程中可做任意修改的存儲區域。用於存放變數。