試題1
voidtest1()
{
charstring[10];
char*str1="0123456789";
strcpy(string,str1);
}
試題2
voidtest2()
charstring[10],str1[10];
inti;
for(i=0;i<10;i++)
str1[i]='a';
試題3
voidtest3(char*str1)
if(strlen(str1)<=10)
試題4:
void GetMemory( char *p )
{
p = (char *) malloc( 100 );
}
void Test( void )
char *str = NULL;
GetMemory( str );
strcpy( str, "hello world" );
printf( str );
傳入中GetMemory( char *p )函數的形參為字元串指針,在函數内部修改形參并不能真正的改變傳入形參的值,執行完
char *str = NULL;
GetMemory( str );
後的str仍然為NULL;
試題5:
char *GetMemory( void )
{
char p[] = "hello world";
return p;
{
char *str = NULL;
str = GetMemory();
printf( str );
char p[] = "hello world";
return p;
的p[]數組為函數内的局部自動變量,在函數傳回後,記憶體已經被釋放。這是許多程式員常犯的錯誤,其根源在于不了解變量的生存期。
試題6:
void GetMemory( char **p, int num )
*p = (char *) malloc( num );
char *str = NULL;
GetMemory( &str, 100 );
strcpy( str, "hello" );
printf( str );
GetMemory避免了試題4的問題,傳入GetMemory的參數為字元串指針的指針,但是在GetMemory中執行申請記憶體及指派語句
*p = (char *) malloc( num );
後未判斷記憶體是否申請成功,應加上:
if ( *p == NULL )
{
……
}
試題6的Test函數中也未對malloc的記憶體進行釋放。/進行申請記憶體失敗處理}
試題7:
char *str = (char *) malloc( 100 );
free( str );
... //省略的其它語句
與試題6同樣的問題,在執行
char *str = (char *) malloc(100);
後未進行記憶體是否申請成功的判斷;另外,在free(str)後未置str為空,導緻可能變成一個“野”指針,應加上:
str = NULL;
剖析:
試題4~7考查面試者對記憶體操作的了解程度,基本功紮實的面試者一般都能正确的回答其中50~60的錯誤。但是要完全解答正确,卻也絕非易事。
對記憶體操作的考查主要集中在:
(1)指針的了解;
(2)變量的生存期及作用範圍;
(3)良好的動态記憶體申請和釋放習慣。
在看看下面的一段程式有什麼錯誤:
swap( int* p1,int* p2 )
int *p;
*p = *p1;
*p1 = *p2;
*p2 = *p;
在swap函數中,p是一個“野”指針,有可能指向系統區,導緻程式運作的崩潰。在VC++中DEBUG運作時提示錯誤“Access Violation”。該程式應該改為: