C記憶體分布

2021-05-28 17:54:40 字數 1012 閱讀 3588

先看一下測試**:

#include #include int g_val;

int g_ival = 5;

char *g_ptr;

char *g_iptr = "hongchunhua";

static int s_val;

static int s_ival = 5;

int print_add(int val)

int main()

輸出結果:

address g_iptr= 0x8048620.

address print_add=      0x80483e4.

address g_ival= 0x8049834.

address g_iptr= 0x8049838.

address s_ival= 0x804983c.

address g_val=  0x8049850.

address g_ptr=  0x8049854.

address s_val=  0x804984c.

address c=      0x8049848.

address p=      0xbfb5d49c.

address val=    0xbfb5d4b0.

address a=      0xbfb5d4a4.

address b=      0xbfb5d4a0.

大體上是從小到大輸出,大體上我們知道0-3g為使用者空間,剩下的1g為核心空間。

從小到大依次為

**區 print_add 和 "hongchunhua"這個字串。

全域性已經初始化區 包括了g_ival, s_ival

全域性未初始化區,包括了g_val, g_ptr, c,s_val

堆,就是p。

棧,包括了val,a和b。

其實在堆和棧中間還有乙個區域,叫做對映區,mmap就用這個區域。

C 記憶體分布

在c 中,記憶體分成5個區,他們分別是堆 棧 自由儲存區 全域性 靜態儲存區和常量儲存區。棧,就是那些由編譯器在需要的時候分配,在不需要的時候自動清楚的變數的儲存區。裡面的變數通常是區域性變數 函式引數等。堆,就是那些由new分配的記憶體塊,他們的釋放編譯器不去管,由我們的應用程式去控制,一般乙個n...

C 記憶體分布

預備知識 程式的記憶體分配 乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os 注意它與資料結構中...

c記憶體分布

在記憶體中程式分別儲存在如下幾個區域中 1 段 或者 正文區 code or text 但是實質都是一樣的,都是用來存放程式語句進行編譯後,形成機器的 一般此記憶體區是唯讀的,防止程式意外修改指令。2 初始資料段 ro rw data segment 這一段其實有兩個段,乙個ro段,乙個data段....