1. 程式人生 > >C/C++面試常考題目討論之二:如何通過函式來分配空間

C/C++面試常考題目討論之二:如何通過函式來分配空間

如何將malloc放在函式裡,如何寫這個函式,以及如何呼叫是經常遇到的問題。
看題目:
1.看下面程式碼有什麼問題

void GetMemory( char *p )
{
p = (char *) malloc( 100 );
}
void Test( void )
{
char *str = NULL;
GetMemory( str );
strcpy( str, “hello world” );
printf( str );
}

(1)這裡最大的問題是p是函式的區域性變數,在函式返回之後就消失了,傳入形參並不能真正改變實參的值,因此不會成功。
(2):在函式GetMemory中和Test中沒有malloc對應的free,造成記憶體洩露 。
2使用指向指標的指標

void GetMemory( char **p, int num )
{
p = (char ) malloc( num );
}
void Test( void )
{
char *str = NULL;
GetMemory( &str, 100 );
strcpy( str, “hello” );
printf( str );
}

這的問題是p = (char ) malloc( num );之後應該加上判斷函式,確定是否分配成功,雖然一般都會成功,但是加上判斷是很好的習慣。也即:

if ( *p == NULL )
{
…//進行申請記憶體失敗處理
}
同時應考慮num>0;

  1. 未釋放堆記憶體 動態分配的記憶體在程式結束之前沒有釋放,應該呼叫free, 把malloc生成的記憶體釋放掉。
  2. printf(str) 改為 printf(“%s”,str)。

即使使用這樣的函式,也要加上是否分配成功的判斷:

void Test( void )
{
char str = (char ) malloc( 100 );
strcpy( str, “hello” );
free( str );
… //省略的其它語句
}