天天看點

找錯

試題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”。該程式應該改為:

上一篇: BT5安裝配置
下一篇: 錯排