天天看點

動态配置設定那些事兒

當編寫程式時,偶爾會不确定數組的大小(包括存儲字元串的數組)。較為友善的做法是等到程式運作時再來确定數組的實際大小。

在标準C中,提供了3個庫函數:malloc(),calloc()和realloc()。那麼他們有什麼差別,分别用在什麼場合呢?

malloc()函數

函數原型:

void * malloc(size_t num_byte)

參數介紹:

  • 一般來說,如果申請成功會它傳回一個無類型(通用)指針,使用者需要通過強制類型轉換将其轉換為你需要的類型。如果申請失敗,函數傳回空指針。
  • num_byte為你申請的空間大小,它固定以8位單位元組為機關。在實際程式設計中,為了程式的可移植性,往往使用sizeof()運算符來計算申請的單個元素資料類型所占的位元組大小。
int *p;
p = (int *)malloc( n * sizeof(int) );
if ( NULL = p ){
    printf("malloc failed!");
    exit(EXIT_FAILURE);
}
...      

-需要注意的是,它從記憶體的堆(heap)資源中配置設定空間,且不會對配置設定的記憶體資源進行初始化。

calloc()函數

函數原型:

void *calloc(size_t n_memb,size_t size)

參數介紹:

-同malloc()函數,如果申請成功會它傳回一個無類型(通用)指針,使用者需要通過強制類型轉換将其轉換為你需要的類型。如果申請失敗,函數傳回空指針。

  • n_memb為申請的元素個數,size為每個元素的所占位元組大小。
  • 在配置設定了記憶體之後,會以對所有位清零的方式進行初始化。
  • 下例展示為n個整數的數組配置設定記憶體空間,并初始化數組元素為0。
int *a;
a = (int *)calloc( n*sizeof(int) );
if(NULL=a){
printf("mallocfailed!");
exit(EXIT_FAILURE);
}      
  • 通過調用以1為第一個實參的方式,可以為任何類型的資料項配置設定已初始化為零的空間。

realloc()函數

  • ptr必須指向先前通過malloc()或calloc()或realloc()函數配置設定的空間指針。
  • size表示記憶體塊的新尺寸,它可以大于或小于原尺寸。
  • 它不會對擴充的記憶體塊進行初始化。
  • 如果配置設定失敗,傳回空指針,且原資料塊不受影響。
  • 如果ptr設定為空指針,行為同malloc()函數。
  • 如果size設定為0,行為同free()函數,即釋放ptr所指空間資源。
  • 在擴大空間的情況下,realloc()會盡量在原地進行擴充,如果無法原地擴充(記憶體塊後面的空間已經用于其他目的),它會在别處重新配置設定記憶體塊,并把舊塊中的資料複制過去。是以,在調用完該函數後,切記更新所有指向該記憶體塊的指針變量。

free()函數

  • 使用它很容易,你隻要把你之前申請的現在不需要的記憶體塊指針傳遞給它就好了。
p = malloc(...);
...
free(p);      
  • 雖然利用free()函數釋放了p指向的記憶體空間,但p的值并沒有改變。如果不把p及時及時及時指向空(NULL),會産生懸空指針,如果之後程式試圖修改它指向的記憶體資料,會有程式崩潰等損失慘重的後果。