程序分為:代碼區、數據區、bss區、堆區、棧區。平時常用區分的是代碼區、堆區、棧區。下面加上例子區分一下。
代碼區顧名思義就是存放代碼的,里面的內容是不可以修改的。例如你定義了一個變量char *buff = "abcdef";這個char型指針指向了代碼區,這個指針里面的數據只可以被讀取不可以別修改,因為指針指向了代碼區,如果你繼續往這個指針里面放東西,會報段錯誤。例如:buff[1] = 'a',這樣會報錯,段錯誤。因為上面已經將buff指向了代碼區,代碼區的數據是不可以改變的,但是你想要給buff[1]賦值,這時編譯的時候不會報錯,但是運行的時候會報段錯誤,這種錯誤對於初學者來說相當惡心,如果報段錯誤建議給我使用gdb調試。段錯誤大部分是因為內存使用錯誤。
棧區:系統分配,系統釋放(跟堆區最重要的區別)。看圖:正確的是因為指針指向了棧區,棧區的數據是可以改變的,所以第一個buff[1] = 'a';是正確的第二個是錯誤的(第二個指向了代碼區)
堆區:說白了就是由程序員分配一塊內存,然后往這塊內存中寫數據,棧區是系統分配內存然后往里面寫數據,棧區是有系統釋放,但是堆區的內存必須有程序員釋放,不然會造成內存泄露(后果相當嚴重,會造成死機現象)。
C++中由new和delete來分配和釋放,C中由malloc和free來分配和釋放。
數據區(靜態區)(static):全局變量和靜態變量的存儲是放在一塊的,初始化的全局變量和靜態變量在一塊區域, 未初始化的全局變量和未初始化的靜態變量在相鄰的另一塊區域。 程序結束后由系統釋放。
BSS段:(bss segment)通常是指用來存放程序中未初始化的全局變量的一塊內存區域。
總結:看下圖: