C 記憶體分布

2021-10-01 08:06:01 字數 3074 閱讀 1804

棧區:由編譯器自動分配釋放,存放函式的引數值,區域性變數等(如遞迴函式)。

常量字元指標arr和整型變數x,y的生命週期就在這個函式內部,函式呼叫完後,它們將被釋放。

void

print

(const

char

*arr)

else

}

堆區:一般由程式設計師分配釋放,招手即來,揮之即走(也就是動態記憶體)。

生命週期:生於new(malloc()),死於delete(free())。 (c語言方式)

若期間開闢記憶體後,沒有釋放記憶體,那麼就會造成記憶體洩漏,直到main函式執行完畢後才會釋放。

char

*p =

null

;//開闢一塊記憶體,p指向這個記憶體

//這個記憶體裡面的初始值為字元b

p =newchar

('b');

printf

("%c\n"

,*p)

;//開闢一塊記憶體大小為10的陣列空間

int*t =

null

; t =

newint[10

];for(

int i=

0;i<

10;i++

)delete p;

delete t;

全域性靜態區:全域性變數和靜態變數的儲存是放在一起的,在程式編譯時分配。

生命週期:main函式什麼時候掛,它就什麼時候掛。

靜態變數只會初始化一次。

#include

#include

int age =18;

//全域性變數

void

run(

)int

main

(void

)

文字常量區:存放常量字串。

//常量字串

char

*p =

"hello"

;char

*q =

"hello"

;//列印位址

printf

("p=0x%p\tq=0x%p\n"

,p,q)

;

程式**區:存放函式體(包括類的成員函式,全域性函式)的二進位制**。

為什麼要使用動態記憶體?

1).按需分配,要多少就分配多少,不會造成浪費。

#include

#include

intmain

(void);

//現在來了乙個插班生

//分配記憶體

p =newint[6

];//現班級6人

for(

int i=

0;i<

sizeof

(age)

/sizeof

(int

);i++)*

(p+5)=

206;

for(

int i=

0;i<

6;i++

)system

("pause");

return0;

}

記憶體拷貝函式:void *memcpy(void *dest, const void *src, size_t n);

標頭檔案:#include

#include

#include

#include

intmain

(void);

//現在來了乙個插班生

//分配記憶體

p =newint[6

];//現班級6人

//記憶體拷貝函式

memcpy

(p,age,

sizeof

(age));

*(p+5)

=206

;for

(int i=

0;i<

6;i++

)system

("pause");

return0;

}

c語言方式:void *malloc(size_t size);

void free(void *);

malloc 在記憶體的動態儲存區中分配一塊長度為 size 位元組的連續區域返回該區域 的首位址.

2).在乙個函式內部開闢空間,在另外乙個函式呼叫。而記憶體不會隨此函式的消亡而消亡。突破了區域性變數空間的限制。

#include

#include

#include

int*

sum(

int n)

return p;

}int

main

(void

)//與(delete q;)等效

free

(q);

//c語言方式釋放記憶體

system

("pause");

return0;

}

3).突破棧區空間限制。棧區空間一般只有幾m,而堆區則有2g左右。(系統不同,棧堆記憶體空間大小也不同)。

明顯堆空間比棧空間大得多。

#include

#include

void

space()

intmain

(void

)

#include

#include

intmain

(void

)

C記憶體分布

先看一下測試 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 輸...

C 記憶體分布

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

C 記憶體分布

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