<address id="ousso"></address>
<form id="ousso"><track id="ousso"><big id="ousso"></big></track></form>
  1. 人鴨共譜和諧曲作文

    時間:2025-10-19 14:30:39 和諧 我要投稿

    人鴨共譜和諧曲作文

      試題1:

    人鴨共譜和諧曲作文

      void test1()

      {

      char string[10];

      char* str1 = “0123456789″;

      strcpy( string, str1 );

      }

      試題2:

      void test2()

      {

      char string[10], str1[10];

      int i;

      for(i=0; i<10; i++)

      {

      str1[i] = ‘a’;

      }

      strcpy( string, str1 );

      }

      試題3:

      void test3(char* str1)

      {

      char string[10];

      if( strlen( str1 ) <= 10 )

      {

      strcpy( string, str1 );

      }

      }

      試題1字符串str1需要11個字節才能存放下(包括末尾的’\0’),而string只有10個字節的空間,strcpy會導致數組越界;

      對試題2,如果面試者指出字符數組str1不能在數組內結束可以給3分;如果面試者指出strcpy(string, str1)調用使得從str1內存起復制到string內存起所復制的字節數具有不確定性可以給7分,在此基礎上指出庫函數strcpy工作方式的給10分;

      對試題3,if(strlen(str1) <= 10)應改為if(strlen(str1) < 10),因為strlen的結果未統計’\0’所占用的1個字節。

      剖析:

      考查對基本功的掌握:

      (1)字符串以’\0’結尾;

      (2)對數組越界把握的敏感度;

      (3)庫函數strcpy的工作方式,如果編寫一個標準strcpy函數的總分值為10,下面給出幾個不同得分的答案:

      2分

      void strcpy( char *strDest, char *strSrc )

      {

      while( (*strDest++ = * strSrc++) != ‘\0’ );

      }

      4分

      void strcpy( char *strDest, const char *strSrc )

      /pic/p>

      {

      while( (*strDest++ = * strSrc++) != ‘\0’ );

      }

      7分

      void strcpy(char *strDest, const char *strSrc)

      {

      /pic/p>

      assert( (strDest != NULL) && (strSrc != NULL) );

      while( (*strDest++ = * strSrc++) != ‘\0’ );

      }

      10分

      /pic/p>

      char * strcpy( char *strDest, const char *strSrc )

      {

      assert( (strDest != NULL) && (strSrc != NULL) );

      char *address = strDest;

      while( (*strDest++ = * strSrc++) != ‘\0’ );

      return address;

      }

      從2分到10分的幾個答案我們可以清楚的看到,小小的strcpy竟然暗藏著這么多玄機,真不是蓋的!需要多么扎實的基本功才能寫一個完美的strcpy啊!

      (4)對strlen的掌握,它沒有包括字符串末尾的’\0′。

      讀者看了不同分值的strcpy版本,應該也可以寫出一個10分的strlen函數了,完美的版本為: int strlen( const char *str ) /pic/p>

      {

      assert( strt != NULL ); /pic/p>

      int len;

      while( (*str++) != ‘\0′ )

      {

      len++;

      }

      return len;

      }

      試題4:

      void GetMemory( char *p )

      {

      p = (char *) malloc( 100 );

      }

      void Test( void )

      {

      char *str = NULL;

      GetMemory( str );

      strcpy( str, “hello world” );

      printf( str );

      }

      試題5:

      char *GetMemory( void )

      {

      char p[] = “hello world”;

      return p;

      }

      void Test( void )

      {

      char *str = NULL;

      str = GetMemory();

      printf( str );

      }

      試題6:

      void GetMemory( char **p, int num )

      {

      *p = (char *) malloc( num );

      }

      void Test( void )

      {

      char *str = NULL;

      GetMemory( &str, 100 );

      strcpy( str, “hello” );

      printf( str );

      }

      試題7:

      void Test( void )

      {

      char *str = (char *) malloc( 100 );

      strcpy( str, “hello” );

      free( str );

      … /pic/p>

      }

      解答:

      試題4傳入中GetMemory( char *p )函數的形參為字符串指針,在函數內部修改形參并不能真正的改變傳入形參的值,執行完

      char *str = NULL;

      GetMemory( str );

      后的str仍然為NULL;

      試題5中

      char p[] = “hello world”;

      return p;

      的p[]數組為函數內的局部自動變量,在函數返回后,內存已經被釋放。這是許多程序員常犯的錯誤,其根源在于不理解變量的生存期。

      試題6的GetMemory避免了試題4的問題,傳入GetMemory的參數為字符串指針的指針,但是在GetMemory中執行申請內存及賦值語句

      *p = (char *) malloc( num );

      后未判斷內存是否申請成功,應加上:

      if ( *p == NULL )

      {

      …/pic/p>

      }

      試題7存在與試題6同樣的問題,在執行

      char *str = (char *) malloc(100);

      后未進行內存是否申請成功的判斷;另外,在free(str)后未置str為空,導致可能變成一個“野”指針,應加上:

      str = NULL;

      試題6的Test函數中也未對malloc的內存進行釋放。

      剖析:

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

      swap( int* p1,int* p2 )

      {

      int p;

      p = *p1;

      *p1 = *p2;

      *p2 = p;

      }

    【人鴨共譜和諧曲作文】相關文章:

    和諧曲作文06-23

    共譜和諧校園的樂章作文800字(通用17篇)10-30

    人鴨情未了的作文12-17

    和諧的作文(共8篇)01-12

    和諧的作文【共6篇】01-03

    和諧的作文共8篇05-01

    和諧的作文[共5篇]11-18

    和諧的作文[共9篇]03-09

    和諧的作文【共5篇】03-19

    和諧的作文【共10篇】07-04

    • 相關推薦
    <address id="ousso"></address>
    <form id="ousso"><track id="ousso"><big id="ousso"></big></track></form>
    1. 日日做夜狠狠爱欧美黑人