資料的元素儲存於記憶體中連續的位置上,當乙個陣列被宣告時,他所需要的內存在編譯時就被分配。當然,我們也可以使用動態記憶體分配在執行時為他分配記憶體。在動態記憶體分配中我們需要經常用到malloc,free,calloc,realloc這四個函式。
malloc和free分別用於執行動態記憶體分配和釋放。當我們需要呼叫一塊記憶體時,就可以選擇malloc函式,malloc會從記憶體中呼叫一塊未被初始化的合適的記憶體,並向程式返回乙個指向該塊記憶體的指標。當一塊以前分配的記憶體不再使用時,我們要用free函式把記憶體塊歸還給記憶體池。
這兩個函式的原型如下所示,他們都在標頭檔案stdlib.h中實現:
void *malloc( size_t size );
void free( void *pointer ); 例:
#include#includeint main()
for(i=0;i<10;i++) //使用
free(p); //釋放記憶體,防止記憶體洩漏
p = null; //釋放位址,防止非法訪問
return 0;
}
calloc 也用於分配記憶體,malloc和calloc之間的主要區別是後者再返回指向記憶體的指標之前把它初始化為0,,另乙個較小的區別是他們請求記憶體數量的方式不同。calloc的引數包括所需元素的數量和每個元素的位元組數。
realloc函式用於修改乙個原先已經分配好的記憶體塊的大小。如果用於擴大乙個記憶體塊,那麼這塊記憶體原先的內容依然保留,新增加的記憶體新增到原先記憶體塊的後面,新記憶體並未以任何方式進行初始化。如果它用於縮小乙個記憶體塊,該記憶體塊尾部的部分記憶體便被拿掉,剩餘部分記憶體的原先內容依然保留。
【注意】:
如果原先的記憶體塊無法改變大小,realloc將分配另一塊正確大小的記憶體,並把原先那塊記憶體的內容複製到新的塊上,釋放原有記憶體塊,並返回新記憶體塊的位址,但不會對新開闢的空間進行初始化。因此,再使用realloc之後,就不能再使用指向舊記憶體的指標,而是該改用realloc所返回的新指標。
這兩個函式的原型如下:
void *calloc( size_t num_elements,size_t element_size );
void realloc( void *ptr,size_t new_size );
例1:
#include#includeint main()
for(i=0;i<10;i++)
free(ptr);
ptr = null;
return 0;
}
例2:
#include#includeint main()
p = realloc(ptr,20*sizeof(int)); //重新調整空間
//realloc會主動釋放之前ptr的空間
if(p != null)
free(ptr);
ptr = null;
return 0;
}
①小心越界訪問
②malloc和free成對使用
③對null指標進行解引用操作
④對已經釋放的動態記憶體的使用
⑤對動態開闢的記憶體的多次釋放
⑥對動態開闢的記憶體的一部分進行釋放
⑦free釋放一塊非動態開闢的記憶體
C語言 動態記憶體開闢
動態記憶體開闢是根據使用者的需要來開闢開間,是在堆上開闢空間的。用於開闢一塊連續的記憶體空間。函式原型 void malloc size t size malloc函式的返回值是乙個void型別的指標,引數為無符號型別資料即申請分配的記憶體大小,單位是位元組。記憶體開闢成功,返回這塊空間的首位址,失...
C語言 動態記憶體開闢
我們已經掌握的記憶體開闢方式有 int val 20 在棧空間上開闢四個位元組 char arr 10 在棧空間上開闢10個位元組的連續空間但是上述開闢空間的方式有兩個特點 1.空間開闢的大小是固定的。2.陣列在宣告的時候,必須指定陣列的長度,它所需要的內存在編譯時分配。但是對於空間的要求,不僅僅是...
C動態記憶體開闢
動態記憶體開闢 malloc calloc realloc 都是在堆上申請空間 一 malloc和free void malloc size t size 動態開闢記憶體 include include include int main int ptr int malloc 10 sizeof in...