先看一下測試**:
#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段....