(C語言)動態記憶體開闢

2021-08-07 16:39:14 字數 1700 閱讀 1906

資料的元素儲存於記憶體中連續的位置上,當乙個陣列被宣告時,他所需要的內存在編譯時就被分配。當然,我們也可以使用動態記憶體分配在執行時為他分配記憶體。在動態記憶體分配中我們需要經常用到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...