C語言之動態函數的使用

1.使用動態內存的目標:

希望在程序執行的運行期間,可以動態的分配內存,由程序員手動的申請和釋放內存;  ->  堆區

2. malloc函數

2.1函數的原型

#include <stdlib.h>
void *malloc(size_t size);

2.2函數的介紹

  函數的參數爲要申請的內存大小,函數的返回值表示分配到內存的首地址,函數的功能就是申請一塊指定大小的動態內存;如果申請失敗,返回NULL,對於申請的內存不會進行初始化

2.3 舉例

    int* p = malloc(sizeof(int));   //C編譯能通過
    int* p = (int*)malloc(sizeof(int));   //C++檢查嚴格
if(p == NULL){ // 申請空間失敗}
    int* q = (int*)malloc(5*sizeof(int));
    char* str = (char*)malloc(sizeof(char));
    struct Student* ps = (struct Student*)malloc(sizeof(struct Student));

3.calloc 函數

 3.1 函數原型

  void *calloc(size_t nmemb, size_t size);

 3.2 函數描述

函數用於申請nmemb個數據,每一個數據的大小是size的內存空間,申請失敗則返回NULL,申請到的內存做清零處理

4. realloc函數

  4.1 函數的原型

  void *realloc(void *ptr, size_t size);

 4.2 函數的描述

  第一個參數是原來內存的首地址,
  第二個參數是新空間的大小,
  返回值是新申請內存的首地址,如果申請失敗,則返回NULL

4.3 注意:

  1)、如果新申請的內存空間比較大,多出來的內存空間不會被初始化,原來的數據不會改變
  2)、如果新申請的內存空間比較小,那麼可能造成數據的丟失
  3)、先判斷當前的指針是否有足夠 的連續內存,如果有則擴大ptr指向的內存地址,並且將ptr返回,
  如果空間不夠,先按照size指定的大小分配內存,將原來的數據拷貝到新內存區域中,釋放原來的內存空間,同時返回新申請內存的首地址、

 4.4 特殊性

 1)、第一個參數爲NULL,相當於malloc函數
 2)、第二個參數爲0,相當於free函數

5.  free函數

內存泄露:如果申請的內存不去使用卻沒有釋放,這塊內存別的程序也無法使用

   5.1函數的原型:

     void free(void *ptr);

   5.2函數的描述

     函數的功能用於釋放ptr所指向的內存區域

6.用途

1)、可以申請不定長的內存空間
2)、可以不受作用域的限定
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章