1. 程式人生 > >程式在記憶體中的佈局

程式在記憶體中的佈局

程式在記憶體中的分佈

C語言程式在記憶體中的分佈

*   程式碼段(.text):存放著程式的機器碼和只讀資料(常量)  
*   全域性區(靜態區):由編譯器編譯時分配,程式執行結束後釋放(屬於靜態記憶體分配),在程式的二進位制檔案中,.bss段不佔儲存空間,只有在載入到記憶體中才分配
        > .data段: 存放已初始化的靜態變數(static 修飾)和全域性變數   
        > .bss段:  存放未初始化的靜態變數和全域性變數(全部初始化為0)
*   堆:是程式猿在程式中動態申請和釋放記憶體的區域,大小不固定
*   棧:程式執行時由編譯器自動分配,存放函式的引數值、區域性變數等值,程式結束後由編譯器自動釋放

程式碼示例:

int a = 0;  //全域性初始化區
char *p1;  //全域性未初始化區
main() {
    int b;// 棧
    char s[] = "abc"; // 棧
    char *p2; //棧
    char *p3 = "123456"; //"123456\0"在常量區,p3在棧上。
    static int c =0; //全域性(靜態)初始化區
    p1 = (char *)malloc(10);
    p2 = (char *)malloc(20);    //動態分配得來得10和20位元組的區域就在堆區。
    strcpy(p1, "123456"); //123456\0放在常量區,編譯器可能會將它與p3所指向的"123456"優化成一個地方。
}

C++程式在記憶體中的分佈:

*   棧區:程式執行時由編譯器自動分配,存放函式的引數值、區域性變數等值,程式結束後由編譯器自動釋放
*   堆區:一般由程式猿動態申請和釋放
*   全域性區(靜態區):編譯器編譯時即分配記憶體。全域性變數和靜態變數的儲存是放在一塊的,初始化的全域性變數和靜態變數在一塊區域,未初始化的全域性變數和未初始化的靜態變數在相鄰的另一塊區域,程式結束後由系統釋放
*   文字常量區:存放常量字串,程式結束後由系統釋放
*   程式程式碼區:程式的二進位制程式碼

程式碼示例:

int a = 0; //全域性初始化區
char *p1; //全域性未初始化區
int main() {
    int b; //棧
    char s[] = "abc"; //棧
    char *p2; //棧
    char *p3 = "123456"; //123456在常量區,p3在棧上。
    static int c =0;//全域性(靜態)初始化區
    p1 = new char[10];
    p2 = new char[20]; //分配得來得10和20位元組的區域就在堆區。   
    strcpy(p1, "123456"); //123456放在常量區,編譯器可能會將它與p3所指向的"123456"優化成一個地方。
}

以上內容參考以下幾篇文章:

相關推薦

後臺開發-核心技術與應用實踐筆記(linux程式記憶體空間佈局

linux下C程式的記憶體五區:程式碼段:存放程式執行程式碼的一塊區域。資料段:包括初始化資料段和未初始化資料段。初始化資料段用於存放已初始化的全域性變數和已初始化的靜態變數。未初始化資料段用於存放未初始化的全域性變數和未初始化的靜態變數。字串常量區:存放字串常量堆:存放程式

C語言程式記憶體:靜態儲存區、堆、棧的區別

一、記憶體基本構成 可程式設計記憶體在基本上分為這樣的幾大部分:靜態儲存區、堆區和棧區。他們的功能不同,對他們使用方式也就不同。 靜態儲存區:記憶體在程式編譯的時候就已經分配好,這塊記憶體在程式的整個執行期間都存在。它主要存放靜態資料、全域性資料和常量。 棧區:在執行函式時,函式內區域性變數的儲存單元都可以在

程式記憶體佈局

C語言程式在記憶體中的分佈 * 程式碼段(.text):存放著程式的機器碼和只讀資料(常量) * 全域性區(靜態區):由編譯器編譯時分配,程式執行結束後釋放(屬於靜態記憶體分配),在程式的二進位制檔案中,.bss段不佔儲存空間,只有在載入到記憶

LINUX程式(程序)在記憶體佈局

   正常情況下每個程序的虛擬地址空間都基本上與上圖類似. 這導致很容易遠端利用安全漏洞攻擊,這種攻 擊往往需要知道程序的一個地址: 一個棧上的地址,或者一個lib庫的一個函式的地址等等. 遠端攻擊者必 須猜測到這個地址然後進行攻擊, 因為地址空間基本一樣,早期的攻擊比較容易,後來慢慢有了地址空間隨 機化技術

關於vs開發windows程式過程記憶體檢查二三事

做為一個C/C++程式設計師,面對資源管理是必不可少的。今天,我對我這些年的經驗的一些總結。 每一個程式在執行時都佔用一塊可用的記憶體空間,用於存放動態分配的物件,此記憶體空間稱為程式的自由儲存區或堆。 C 語言程式使用一對標準庫函式 malloc 和 free 在自由儲存區

使用Valgrind找出AndroidNative程式記憶體洩露問題

轉自 https://blog.csdn.net/roland_sun/article/details/46049485   Android程式通常使用Java程式編寫,由於Dalvik虛擬機器集成了垃圾回收機制,所以記憶體使用比較不容易出錯,通常就是一個本該被釋放的物件

易學筆記-計算機底層-第1章:計算機系統漫遊/1.4 處理器處理記憶體的指令/1.4.2 執行hello程式

執行hello程式 流程圖 解釋: 從鍵盤接受使用者輸入的hello 把該輸入通過IO橋送到匯流排介面,由匯流排介面送到暫存器 暫存器再通過I/O橋把hello送到主存 敲

jvm 物件在記憶體儲存的佈局

jvm  物件在記憶體中儲存的佈局有三部分:物件頭、例項資料、對齊填充。 1、物件頭:執行時資料、型別指標、陣列長度。 (1)執行時資料:hashcode雜湊碼、鎖狀態標誌、執行緒持有的鎖、GC年齡分代等,有些不是固定不變的,在執行時會根據當時的狀態進行修改。 (2)型別指標:

C++/C程式記憶體佈局及函式棧結構

一:系統的程式佈局圖: 二、詳解: 程式空間: 包括.txt程式碼段,.data資料段, .bss段,堆段,棧段。程式的地址從低往高。堆空間增長方向從低地址往高地址增長。 棧空間從高地址往低地址方向增長。從左往右方向為單位元組增長方向。

剖析記憶體程式之祕

  記憶體管理是作業系統的核心任務;它對程式設計師和系統管理員來說也是至關重要的。在接下來的幾篇文章中,我將從實踐出發著眼於記憶體管理,並深入到它的內部結構。雖然這些概念很通用,但示例大都來自於 32 位 x86 架構的 Linux 和 Windows 上。這第一篇文章描述了

物件在記憶體佈局——物件的建立

  我們在任何一個專案中,無時無刻不關注物件的建立,時時刻刻都在建立物件,都在使用物件,那麼,我們就從虛擬機器的角度來看物件的建立。 首先,我們知道,建立物件有多種方式,最直觀的一種方式就是通過new關鍵字來建立物件,而且我們之前也提到過了,我們知道,通過new建立一個物件,

大頁記憶體(HugePages)在通用程式優化的應用

在介紹之前需要強調一點,大頁記憶體也有適用範圍,程式耗費記憶體很小或者程式的訪存區域性性很好,大頁記憶體很難獲得性能提升。所以,如果你面臨的程式優化問題有上述兩個特點,請不要考慮大頁記憶體。後面會詳細解釋為啥具有上述兩個特點的程式大頁記憶體無效。 背景

在Eclipse使用MAT分析Android程式記憶體使用狀況(轉)

對於Android這種手持裝置來說,通常不會帶有太大的記憶體,而且一般使用者都是長時間不重啟手機,所以編寫程式的時候必須要非常小心的使用記憶體,儘量避免有記憶體洩露的問題出現。通常分析程式中潛在記憶體洩露的問題是一件很有難度的工作,一般都是由團隊中的資深工程師負責,而且隨著程式程式碼量的提高,難度還會逐步加大

程式記憶體的分佈

程式碼段(.text),也稱文字段(Text Segment),存放著程式的機器碼和只讀資料,可執行指令就是從這裡取得的。如果可能,系統會安排好相同程式的多個執行實體共享這些例項程式碼。這個段在記憶體中一般被標記為只讀,任何對該區的寫操作都會導致段錯誤(Segmentation Fault)。 資料段

C語言記憶體分佈及程式執行(BSS段、資料段、程式碼段、堆疊)

BSS段:(bss segment)通常是指用來存放程式中未初始化的全域性變數的一塊記憶體區域。BSS是英文Block Started by Symbol的簡稱。BSS段屬於靜態記憶體分配。 資料段 :資料段(data segment)通常是指用來存放程式中 已初始化 

Linux應用程式記憶體地址佈局

一個典型的Linux C程式記憶體空間由如下幾部分組成:程式碼段(.text):這裡存放程式碼、全域性常量(const)、字串常量。程式碼段是可共享的,相同的程式碼在記憶體中只會有一個拷貝,同時這

C/C++程式記憶體區域劃分大總結

此圖來自http://www.blog.163.com/tao198352__4232/blog/static/8502064520105611157897/ 程式由程式碼和資料組成,其中程式碼儲存在程式碼區中,資料根據型別的不同儲存在不同的區域中

linux 反彙編分析變數地址並用gdb修改執行程式記憶體變數實驗

準備樣本檔案: a.c #include <stdio.h> #include <unistd.h> unsigned int a=0xFFFFFFFF; unsigned

程式各變數在記憶體的位置

主要給初學者介紹下,我們編寫的程式中,我們的程式碼,全域性變數和靜態變數在記憶體中是怎麼存放的,我們new或者malloc出來的變數,在記憶體中是怎麼分配的, 全域性變數,靜態變數----存於資料區; 區域性變數,函式形參----存於stack; 函式程式碼-

從編寫原始碼到程式記憶體執行的全過程解析

        作為一個C/C++程式設計師,搞清楚從編寫原始碼到程式執行過程中發生的細節是很有必要的。這在之前也是困擾我的一個很大問題,因為最近在忙著找實習,一直沒有下定決心來寫這篇部落格,最近才抽時間寫。下面的程式碼除了明顯貼出來的以外,其他的都以下面的程式碼為例進行說明