程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 深刻C說話內存區域分派(過程的各個段)詳解

深刻C說話內存區域分派(過程的各個段)詳解

編輯:關於C++

深刻C說話內存區域分派(過程的各個段)詳解。本站提示廣大學習愛好者:(深刻C說話內存區域分派(過程的各個段)詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是深刻C說話內存區域分派(過程的各個段)詳解正文


C說話可履行代碼構造

稱號 內容
代碼段  可履行代碼、字符串常量 數據段  已初始化全局變量、已初始化全局靜態變量、部分靜態變量、常量數據 BSS段  未初始化全局變量,未初始化全局靜態變量 棧  部分變量、函數參數 堆  靜態內存分派

(1)代碼段(text segment):寄存CPU履行的機械指令。平日代碼段是可同享的,這使得須要頻仍被履行的法式只須要在內存中具有一份拷貝便可。代碼段也平日是只讀的,如許可以避免其他法式不測地修正其指令。別的,代碼段還計劃下場部數據所請求的內存空間信息。

代碼段(code segment/text segment)平日是指用來寄存法式履行代碼的一塊內存區域。這部門區域的年夜小在法式運轉前就曾經肯定,而且內存區域平日屬於只讀, 某些架構也許可代碼段為可寫,即許可修正法式。在代碼段中,也有能夠包括一些只讀的常數變量,例如字符串常量等。

(2)數據段(data segment):或稱全局初始化數據段/靜態數據段(initialized data segment/data segment)。該段包括了在法式中明白被初始化的全局變量、靜態變量(包含全局靜態變量和部分靜態變量)和常量數據。

(3)未初始化數據段:亦稱BSS(Block Started by Symbol)。該段存入的是全局未初始化變量、靜態未初始化變量。
而當法式被加載到內存單位時,則須要別的兩個域:堆域和棧域。

(4)棧段(stack):寄存函數的參數值、部分變量的值,和在停止義務切換時寄存以後義務的高低文內容。

(5)堆段(heap):用於靜態內存分派,即便用malloc/free系列函數來治理的內存空間。
在將運用法式加載到內存空間履行時,操作體系擔任代碼段、數據段和BSS段的加載,並將在內存中為這些段分派空間。棧段亦由操作體系分派和治理,而不須要法式員顯示地治理;堆段由法式員本身治理,即顯示地請求和釋放空間。

別的,可履行法式在運轉時具有響應的法式屬性。在有操作體系支撐時,這些屬性頁由操作體系治理和保護。
上面給出示例法式代碼,正文曾經在代碼中寫明:

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

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved