欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

深入C語言內(nèi)存區(qū)域分配(進程的各個段)詳解

 更新時間:2013年07月11日 11:52:17   作者:  
一般情況下,一個可執(zhí)行二進制程序(更確切的說,在Linux操作系統(tǒng)下為一個進程單元,在UC/OSII中被稱為任務)在存儲(沒有調(diào)入到內(nèi)存運行)時擁有3個部分,分別是代碼段(text)、數(shù)據(jù)段(data)和BSS段。這3個部分一起組成了該可執(zhí)行程序的文件
C語言可執(zhí)行代碼結(jié)構(gòu)

名稱 內(nèi)容
代碼段  可執(zhí)行代碼、字符串常量
數(shù)據(jù)段  已初始化全局變量、已初始化全局靜態(tài)變量、局部靜態(tài)變量、常量數(shù)據(jù)
BSS段  未初始化全局變量,未初始化全局靜態(tài)變量
 局部變量、函數(shù)參數(shù)
 動態(tài)內(nèi)存分配

(1)代碼段(text segment):存放CPU執(zhí)行的機器指令。通常代碼段是可共享的,這使得需要頻繁被執(zhí)行的程序只需要在內(nèi)存中擁有一份拷貝即可。代碼段也通常是只讀的,這樣可以防止其他程序意外地修改其指令。另外,代碼段還規(guī)劃了局部數(shù)據(jù)所申請的內(nèi)存空間信息。

代碼段(code segment/text segment)通常是指用來存放程序執(zhí)行代碼的一塊內(nèi)存區(qū)域。這部分區(qū)域的大小在程序運行前就已經(jīng)確定,并且內(nèi)存區(qū)域通常屬于只讀, 某些架構(gòu)也允許代碼段為可寫,即允許修改程序。在代碼段中,也有可能包含一些只讀的常數(shù)變量,例如字符串常量等。

(2)數(shù)據(jù)段(data segment):或稱全局初始化數(shù)據(jù)段/靜態(tài)數(shù)據(jù)段(initialized data segment/data segment)。該段包含了在程序中明確被初始化的全局變量、靜態(tài)變量(包括全局靜態(tài)變量和局部靜態(tài)變量)和常量數(shù)據(jù)。

(3)未初始化數(shù)據(jù)段:亦稱BSS(Block Started by Symbol)。該段存入的是全局未初始化變量、靜態(tài)未初始化變量。
而當程序被加載到內(nèi)存單元時,則需要另外兩個域:堆域和棧域。

(4)棧段(stack):存放函數(shù)的參數(shù)值、局部變量的值,以及在進行任務切換時存放當前任務的上下文內(nèi)容。

(5)堆段(heap):用于動態(tài)內(nèi)存分配,即使用malloc/free系列函數(shù)來管理的內(nèi)存空間。
在將應用程序加載到內(nèi)存空間執(zhí)行時,操作系統(tǒng)負責代碼段、數(shù)據(jù)段和BSS段的加載,并將在內(nèi)存中為這些段分配空間。棧段亦由操作系統(tǒng)分配和管理,而不需要程序員顯示地管理;堆段由程序員自己管理,即顯示地申請和釋放空間。

另外,可執(zhí)行程序在運行時具有相應的程序?qū)傩?。在有操作系統(tǒng)支持時,這些屬性頁由操作系統(tǒng)管理和維護。
下面給出示例程序代碼,注釋已經(jīng)在代碼中寫明:

復制代碼 代碼如下:

/*代碼段、數(shù)據(jù)段和BSS段存儲變量類型*/
#include <stdio.h>
const int    g_A       = 10;            //代碼段
int            g_B       = 20;            //數(shù)據(jù)段
static int    g_C       = 30;            //數(shù)據(jù)段
static int    g_D;                    //BSS段
int            g_E;                    //BSS段
char        *p1;                    //BSS段
void main( )
{
    int           local_A;            //棧
    static int    local_C = 0;        //數(shù)據(jù)段
    static int    local_D;            //數(shù)據(jù)段

    char        *p3 = "123456";     //123456在代碼段,p3在棧上
    p1 = (char *)malloc( 10 );      //堆,分配得來得10字節(jié)的區(qū)域在堆區(qū)
    strcpy( p1, "123456" );         //123456{post.content}放在常量區(qū),編譯器可能會將它與p3所指向 的"123456"優(yōu)化成一塊
    printf("\n");
    printf( "代碼段,全局初始化變量, 只讀const,  g_A,     addr:0x%08x\n", &g_A);
    printf("\n");
    printf( "數(shù)據(jù)段,全局變量,       初始化      g_B,     addr:0x%08x\n", &g_B);
    printf( "數(shù)據(jù)段,靜態(tài)全局變量,   初始化,     g_C,     addr:0x%08x\n", &g_C);
    printf("\n");
    printf( "BSS段, 全局變量,       未初始化    g_E,     addr:0x%08x\n", &g_E, g_E );   
    printf( "BSS段, 靜態(tài)全局變量,   未初始化,   g_D,     addr:0x%08x\n", &g_D );
    printf( "BSS段, 靜態(tài)局部變量,   初始化,     local_C, addr:0x%08x\n", &local_C);
    printf( "BSS段, 靜態(tài)局部變量,   未初始化,   local_D, addr:0x%08x\n", &local_D);
    printf("\n");
    printf( "棧,    局部變量,                   local_A, addr:0x%08x\n", &local_A );
    printf("\n");
    printf( "堆,    malloc分配內(nèi)存,             p1,      addr:0x%08x\n", p1 );
}

相關(guān)文章

  • C++實現(xiàn)LeetCode(63.不同的路徑之二)

    C++實現(xiàn)LeetCode(63.不同的路徑之二)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(63.不同的路徑之二),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • c語言求階乘精確值示例

    c語言求階乘精確值示例

    這篇文章主要介紹了c語言求階乘精確值示例,需要的朋友可以參考下
    2014-03-03
  • C++實現(xiàn)教務管理系統(tǒng)

    C++實現(xiàn)教務管理系統(tǒng)

    這篇文章主要為大家詳細介紹了C++實現(xiàn)教務管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • C/C++如何實現(xiàn)兩矩陣相乘之模擬法

    C/C++如何實現(xiàn)兩矩陣相乘之模擬法

    C++矩陣運算矩陣運算包括矩陣相加、相減、相乘、轉(zhuǎn)置、求逆矩陣等等,用計算機程序?qū)崿F(xiàn)矩陣運算的方法算法很多,這篇文章主要給大家介紹了關(guān)于C/C++如何實現(xiàn)兩矩陣相乘之模擬法的相關(guān)資料,需要的朋友可以參考下
    2023-02-02
  • C語言中的const和free用法詳解

    C語言中的const和free用法詳解

    C語言中的const和C++中的const是有區(qū)別的,而且在使用VS編譯測試的時候,如果是C的話,請一定要建立一個后綴為C的文件,不要是CPP的文件。因為,兩個編譯器會有差別的。下面通過本文給大家分享C語言中的const和free用法,感興趣的朋友一起看看吧
    2017-04-04
  • C語言中的柔性數(shù)組你真的了解嗎

    C語言中的柔性數(shù)組你真的了解嗎

    這篇文章主要為大家詳細介紹了C語言中的柔性數(shù)組你,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • C++ OpenCV實戰(zhàn)之手寫數(shù)字識別

    C++ OpenCV實戰(zhàn)之手寫數(shù)字識別

    這篇文章主要為大家詳細介紹了如何使用machine learning機器學習模塊進行手寫數(shù)字識別功能,文中的示例代碼講解詳細,感興趣的可以了解一下
    2022-08-08
  • C++中memcpy和memmove的區(qū)別總結(jié)

    C++中memcpy和memmove的區(qū)別總結(jié)

    這篇文章主要介紹了C++中memcpy和memmove的區(qū)別總結(jié),這個問題經(jīng)常出現(xiàn)在C++的面試題目中,需要的朋友可以參考下
    2014-10-10
  • C++實現(xiàn)簡單插件機制原理解析

    C++實現(xiàn)簡單插件機制原理解析

    這篇文章主要介紹了C++實現(xiàn)簡單插件機制原理解析,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-02-02
  • C++命名空間使用詳細介紹

    C++命名空間使用詳細介紹

    考慮一種情況,當我們有兩個同名的人,Zara,在同一個班里。當我們需要對它們進行區(qū)分我們必須使用一些額外的信息和它們的名字,比如它們生活在不同的區(qū)域或者興趣愛好什么的,在C++程序中也會遇到同樣的情況,所以命名空間就此產(chǎn)生
    2022-09-09

最新評論