棧區:由編譯器自動分配釋放,存放函式的引數值,區域性變數等(如遞迴函式)。
常量字元指標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 注意它與資料結構中...