C語言到底怎么分配空間


  • 程序分為:代碼區、數據區、bss區、堆區、棧區。平時常用區分的是代碼區、堆區、棧區。下面加上例子區分一下。

    c語言內存分配與指針講解
  • 3

    代碼區顧名思義就是存放代碼的,里面的內容是不可以修改的。例如你定義了一個變量char *buff = "abcdef";這個char型指針指向了代碼區,這個指針里面的數據只可以被讀取不可以別修改,因為指針指向了代碼區,如果你繼續往這個指針里面放東西,會報段錯誤。例如:buff[1] = 'a',這樣會報錯,段錯誤。因為上面已經將buff指向了代碼區,代碼區的數據是不可以改變的,但是你想要給buff[1]賦值,這時編譯的時候不會報錯,但是運行的時候會報段錯誤,這種錯誤對於初學者來說相當惡心,如果報段錯誤建議給我使用gdb調試。段錯誤大部分是因為內存使用錯誤。

    c語言內存分配與指針講解
  • 4

    棧區:系統分配,系統釋放(跟堆區最重要的區別)。看圖:正確的是因為指針指向了棧區,棧區的數據是可以改變的,所以第一個buff[1] = 'a';是正確的第二個是錯誤的(第二個指向了代碼區)

    c語言內存分配與指針講解
  • 5

    堆區:說白了就是由程序員分配一塊內存,然后往這塊內存中寫數據,棧區是系統分配內存然后往里面寫數據,棧區是有系統釋放,但是堆區的內存必須有程序員釋放,不然會造成內存泄露(后果相當嚴重,會造成死機現象)。

    C++中由new和delete來分配和釋放,C中由malloc和free來分配和釋放。

    c語言內存分配與指針講解
  • 6

    數據區(靜態區)(static):全局變量和靜態變量的存儲是放在一塊的,初始化的全局變量和靜態變量在一塊區域, 未初始化的全局變量和未初始化的靜態變量在相鄰的另一塊區域。 程序結束后由系統釋放。

    BSS段:(bss segment)通常是指用來存放程序中未初始化的全局變量的一塊內存區域。

    c語言內存分配與指針講解
  • 7

    總結:看下圖:

    c語言內存分配與指針講解
     
     
     
     
     
    免責聲明:如有侵權請聯系刪除

  • 免責聲明!

    本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



     
    粵ICP備18138465號   © 2018-2025 CODEPRJ.COM