一. 存儲區(qū)的劃分
由高地址向低地址:
1. 棧區(qū) ? ? ? ? int a = 3;
2. 堆區(qū) ? ? ? ? malloc(100);
3. 靜態(tài)區(qū) ? ? ?static int b = 5;
4. 常量區(qū) ? ? ?"carson"
5. 代碼區(qū) ? ? ?void func();``````````
二. 棧區(qū)
1. 不允許在函數(shù)體內(nèi)返回一個在棧內(nèi)存中分配的局部變量的地址.否則函數(shù)調(diào)用后主調(diào)函數(shù)中接收地址的指針就會因為局部變量被回收而獲取不到有效數(shù)據(jù),此指針被稱為野指針或者僵尸指針.
例如:
char *func(void) {
return string;
}
char *p = func();
printf("%p\n",p);
即不可以返回函數(shù)中的局部變量的地址,可能會取不到數(shù)據(jù).
如下即可:
//int max (int a, int b) {
//retrun a > b ? a : b;
//}
int result = max(3,5);
printf("%d\n",result);
三. 堆區(qū)
堆區(qū)空間屬于開發(fā)人員根據(jù)需求調(diào)用分配函數(shù)自由分配的空間,再使用完成后需要調(diào)用free函數(shù)標(biāo)記刪除.所謂標(biāo)記刪除,即:對應(yīng)空間并不會被清空數(shù)據(jù),而是通過添加標(biāo)記的形式,告訴操作系統(tǒng)這塊內(nèi)存空間可以重新參與內(nèi)存分配,其保存的數(shù)據(jù)直到下一次占用這塊空間的數(shù)據(jù)覆蓋.
malloc返回的數(shù)據(jù)類型時? void *,此類型時泛型指針,只描述返回值是地址類型,并不確定該空間將來存儲何種類型的數(shù)據(jù).具體存儲數(shù)據(jù)的類型由接收改地址的指針類型確定.
realloc(address,size)函數(shù)是為已有堆空間重新指定大小的函數(shù),其有兩個特征:
1. 如果已有空間后還有足夠大的可用空間,則在已有空間后追加新的空間.
2. 如果已有空間后并無足夠大的可用空間,則在堆區(qū)其他區(qū)域開辟完整空間,并將原有空間的內(nèi)容拷貝到新空間頭部,釋放原有空間.
calloc(n,size)開辟n個指定大小的連續(xù)堆空間,并按字節(jié)清零.比malloc函數(shù)多了一步初始化的過程.
四. 靜態(tài)區(qū)
靜態(tài)區(qū)定義的變量需要使用static關(guān)鍵字修飾,該變量只定義一次,直到程序運行結(jié)束才會回收內(nèi)存.
五. 常量區(qū)
常量區(qū)的作用是保存常量數(shù)據(jù),常量區(qū)的數(shù)據(jù)只可讀,不能被修改.
六. 代碼區(qū)