c語言占用的記憶體可以分為5個區:
**區(text segment):不難理解,就是用於放置編譯過後的**的二進位制機器碼。
堆區(heap):用於動態記憶體分配。一般由程式設計師分配和釋放,若程式設計師不釋放,結束程式時有可能由作業系統**(其實就是malloc()函式能夠掌控的記憶體區域)
棧區(stack):由編譯器自動分配和釋放,一般用來存放區域性變數、函式引數(重點!)。
全域性初始化資料區/靜態資料區(data segment):顧名思義,就是存放全域性變數和靜態變數的地方。這個區域被整個程序共享。
未初始化資料區(bss):在執行時改變值。改變值(初始化)的時候,會根據它是全域性變數還是區域性變數,進到他們該去的區。否則會持續待在bss裡面與世無爭。
在windows下,data segment的所允許的空間大小取決於剩餘記憶體的大小,也就是說,如果電腦剩餘8g記憶體的話,int型別的二維陣列甚至可以開到46340*46340的大小;
而stack的空間只有2m!!也就是210241024=2097152位元組,區域性變數空間頂多放得下下524288個int型別!如果想在函式中開闢大陣列,需要格外注意記憶體溢位的問題。
所以如果想在區域性中開乙個大陣列怎麼辦?很簡單,將它歸到data segment中即可,即將其作為全域性變數或靜態變數。
c語言記憶體對齊問題
計算機中的記憶體都是按照byte為單位進行分配,在理論上資料可以儲存在記憶體中的任意位置。計算機為了提高工作效率,一般要求記憶體中的資料存放在特定的位置,使計算機用最少的機器週期便可以訪問到這個資料,這就是c語言中的記憶體對齊問題。這裡以 int 型資料為例,如果記憶體中的資料按照4位元組對齊儲存,...
c語言 記憶體分配問題
記憶體分配問題 記憶體分配方式有三種 1 從靜態儲存區域分配。內存在程式編譯的時候就已經分配好,這塊內存在程式的整個執行期間都存在。例如全域性變數,static 變數。2 在棧上建立。在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函式執行結束時這些儲存單元自動被釋放。棧記憶體分配運算內置...
c語言記憶體重疊問題
c語言關鍵字,編譯器優化時使用,不要對編譯器撒謊,如果把乙個指標定義成restrict 編譯器會相信你,並對程式進行優化,如果出現記憶體重疊的問題,編譯器不會替你排查。memcpy 會有記憶體重疊的問題,memove 會提前幫你檢查是否有記憶體重疊的問題。visual studio 把函式和變數定義...