linux下C/C++程序的內存布局


內核空間和用戶空間:

  我們在編寫程序時使用的內存空間叫虛擬內存,程序在運行時,要完成虛擬內存到物理內存的轉換。假如在32位環境上,理論上我們可以使用的虛擬內存空間是4GB,但實際上這4GB並不能完全給我們使用,有一部分內存是固定分配給操作系統內核的,分配給操作系統的這部分內存我們叫它內核空間,除去內核空間以后用戶能使用的內存叫用戶空間,在linux 32環境下,高地址的1GB是固定給內核使用的,低地址的3GB才是給用戶使用的。

用戶空間內存分配情況:

各個內存分區的說明:

 

內存分區 說明
程序代碼區
(code)
存放函數體的二進制代碼。一個C語言程序由多個函數構成,C語言程序的執行就是函數之間的相互調用。
常量區
(constant)
存放一般的常量、字符串常量等。這塊內存只有讀取權限,沒有寫入權限,因此它們的值在程序運行期間不能改變。
全局數據區
(global data)
存放全局變量、靜態變量等。這塊內存有讀寫權限,因此它們的值在程序運行期間可以任意改變。
堆區
(heap)
一般由程序員分配和釋放,若程序員不釋放,程序運行結束時由操作系統回收。malloc()calloc()free() 等函數操作的就是這塊內存,這也是本章要講解的重點。

注意:這里所說的堆區與數據結構中的堆不是一個概念,堆區的分配方式倒是類似於鏈表。
動態鏈接庫 用於在程序運行期間加載和卸載動態鏈接庫。
棧區
(stack)
存放函數的參數值、局部變量的值等,其操作方式類似於數據結構中的棧。

舉例:

#include <stdio.h>

char *str1 = "hello world";  //字符串在常量區,str1在全局數據區
int n;  //全局數據區

char* func(){
    char *str = "hello world";  //字符串在常量區,str在棧區
    return str;
}

int main(){
    int a;  //棧區
    char *str2 = "01234";  //字符串在常量區,str2在棧區
    char  arr[20] = "56789";  //字符串和arr都在棧區
    char *pstr = func();  //棧區
    int b;  //棧區

    return 0;
}

 

 

  


免責聲明!

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



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