程式分為:**區、資料區、bss區、堆區、棧區。平時常用區分的是**區、堆區、棧區。下面加上例子區分一下。
3**區顧名思義就是存放**的,裡面的內容是不可以修改的。例如你定義了乙個變數char *buff = "abcdef";這個char型指標指向了**區,這個指標裡面的資料只可以被讀取不可以別修改,因為指標指向了**區,如果你繼續往這個指標裡面放東西,會報段錯誤。例如:buff[1] = 'a',這樣會報錯,段錯誤。因為上面已經將buff指向了**區,**區的資料是不可以改變的,但是你想要給buff[1]賦值,這時編譯的時候不會報錯,但是執行的時候會報段錯誤,這種錯誤對於初學者來說相當噁心,如果報段錯誤建議給我使用gdb除錯。段錯誤大部分是因為記憶體使用錯誤。
4棧區:系統分配,系統釋放(跟堆區最重要的區別)。看圖:正確的是因為指標指向了棧區,棧區的資料是可以改變的,所以第乙個buff[1] = 'a';是正確的第二個是錯誤的(第二個指向了**區)
5堆區:說白了就是由程式設計師分配一塊記憶體,然後往這塊記憶體中寫資料,棧區是系統分配記憶體然後往裡面寫資料,棧區是有系統釋放,但是堆區的記憶體必須有程式設計師釋放,不然會造成記憶體洩露(後果相當嚴重,會造成宕機現象)。
c++中由new和delete來分配和釋放,c中由malloc和free來分配和釋放。
6資料區(靜態區)(static):全域性變數和靜態變數的儲存是放在一塊的,初始化的全域性變數和靜態變數在一塊區域, 未初始化的全域性變數和未初始化的靜態變數在相鄰的另一塊區域。 程式結束後由系統釋放。
bss段:(bss segment)通常是指用來存放程式中未初始化的全域性變數的一塊記憶體區域。
7總結:看下圖:
C語言 結構體儲存空間分配
這兩天在看結構體,一直在琢磨結構體的儲存空間分配的問題,琢磨了半天總算明白了。和大家分享一下,希望能有所幫助。相信大家都知道結構體裡元素儲存要對齊吧,話雖是沒錯,只是這個 對齊 裡面包含了很多微妙的東西。首先詳細的給出結構體內存儲存空間分配的原則吧 編譯器按照成員列表順序乙個接乙個地給每個成員分配記...
C語言如何動態分配空間 malloc
一般的變數在定義是就要確定大小,但是有的時候不知道使用者的需要,就比如說排序,你不知道使用者想要給幾個數排序,所以為了保險起見往往是定義乙個很大的變數,而實際上使用者可能只需要給5個數排序,你卻int k 1024 來存放要排序的數,造成極大的浪費。這裡介紹乙個函式用於動態分配空間 malloc 原...
C 物件空間分配過程
全域性變數或是區域性靜態變數,分配在資料段。由c 預設建立和撤銷,自動呼叫建構函式和析構函式,該方法建立的物件呼叫類方法時,必須用 用new 動態建立的物件,用delete來撤銷該物件,c 用new建立物件時返回的是乙個物件指標 new建立的物件不是用 或 來訪問該物件的成員函式的,而是用運算子 1...