1,堆記憶體特點
堆記憶體可以存放任意型別的資料,但需要自己申請與釋放。
2,堆大小
堆大小,想像中的無窮大,但實際使用中,受限於實際記憶體的大小和記憶體是否有連續性。
1,malloc函式
2,calloc函式
3,realloc函式
4,free函式
示例:
#include
#include
int main()
free(p);
int}
realloc函式只能擴容而不能縮容。
realloc函式擴容之後返回的指標和指標可能不同,可能相同。因為,若在原堆記憶體空間之後有足夠大的並且是連續的空間供擴容使用,則返回的指標與原指標相同;否則,就會另找一塊足夠大的連續空間開闢「擴容後大小」的 堆記憶體空間,將原堆記憶體空間裡的值複製到新的記憶體空間並釋放掉原堆記憶體空間。最後,返回新開闢的堆記憶體空間的首位址。
#include
#include
int main()
printf("output array!\n");
for(int i=0;iprintf("%d\n",pa[i]);
}return
0;}
以下三個模型,是針對堆記憶體的使用特點而設計的:
1,申請返回判空
釋放以後未置為null或繼續使用
char *p=(char *)malloc(100);
if(null == p)
strcpy(p,"hello");
free(p);
//p指向的空間被釋放,但p內儲存的位址仍然存在,並且變成非法空間
p=null;
//將p置為空(null),防止p所指向的空間被使用
//若僅僅釋放而不置空,則可能會出現下來的錯誤
if(null != p)
2,伺服器模型
未釋放原有空間,而重新申請新空間,造成原有空間記憶體洩漏
while(1)
printf("******\n");
printf("oooooo\n");
p=(char *)malloc(1000);
//之前在堆上申請的空間尚未釋放而又申請了一段新的空間,造成記憶體洩漏
free(p);
}
3,誰申請誰釋放模型(並非絕對)
如果沒有協同的原則,則可能會造成重複釋放
void func(char *p)
int main()
func(p);
free(p);//main中申請的堆空間,在main函式中釋放
return
0; }
C語言之動態記憶體分配
準備 動態記憶體分配 一 為什麼用動態記憶體分配 但我們未學習鍊錶的時候,如果要儲存數量比較多的同型別或同結構的資料的時候,總是使用乙個陣列。比如說我們要儲存乙個班級學生的某科分數,總是定義乙個float型 存在0.5分 陣列 float score 30 但是,在使用陣列的時候,總有乙個問題困擾著...
C語言之動態記憶體分配
對記憶體的動態分配是通過系統提供的庫函式來實現的,主要有malloc calloc free realloc這4個函式。1 malloc函式 函式原型為void malloc unsigned int size 其作用是在記憶體的動態儲存區中分配乙個長度為size的連續空間。此函式是乙個指標型函式,...
c語言動態記憶體分配 C 動態記憶體分配
動態記憶體分配 雖然通過陣列就可以對大量的資料和物件進行有效地管理,但是很多情況下,在程式執行之前,我們並不能確切地知道陣列中會有多少個元素。這種情況下,如果陣列宣告過大,就會造成浪費 宣告過小,就會影響處理。在c 中,動態記憶體分配技術可以保證程式在執行過程中按照需要申請適量記憶體,使用後釋放,從...