不限長度動態(tài)分配內(nèi)存(malloc、calloc和realloc) 讓內(nèi)存使用率提高
(1)、malloc在分配內(nèi)存之后不會對分配的內(nèi)存進(jìn)行初始化
(2)、calloc在分配內(nèi)存之后,在返回指向已分配的內(nèi)存的指針之前會對內(nèi)存進(jìn)行初始化
(3)、realloc用于修改一個原先已分配的內(nèi)存塊大小,如果原先的內(nèi)存塊大小無法改變,該函數(shù)將分配一塊正確大小的內(nèi)存,并把原先那塊內(nèi)存的內(nèi)容復(fù)制到新分配的內(nèi)存塊上。所以在使用該函數(shù)后,就不能再使用指向舊內(nèi)存塊的指針。該函數(shù)不對新內(nèi)存初始化。
(4)、在一塊內(nèi)存不使用時使用free函數(shù)將內(nèi)存釋放。
下面的程序是動態(tài)分配內(nèi)存:
/** * 將字符串復(fù)制到動態(tài)分配的內(nèi)存中,不限值字符串的長度 * @file string_alloc.c * @brief * @author struggleLinux@gmail.com * @version 1.0 * @date 2011-05-19 */ #include #include #include #define False 0 /** * 獲取字符并動態(tài)分配內(nèi)存空間 * @brief alloc_string * * @return */ char * alloc_string( ) { char *string; int i , flag; string = (char *)malloc(1); //為分配一個字符長度 if( string == NULL ) return NULL; for( i = 0 ; (*(string+i) = getchar()) != EOF ;i++ ){ if(*(string+i) == 'Q' ){ //Q退出循環(huán) *(string+i) = '\0'; break; } string = (char * )realloc( string,strlen(string)+1); //為string重新分配長度 if( string == NULL ){ break; } } return string; } int main() { char *str; str = alloc_string(); if( str == NULL ) printf("ERRORS:動態(tài)分配錯誤"); else printf("字符串為:\n%s\n",str); return 0; }