指針高級--

 //  execise2.cpp : Defines the entry point for the console application.
 //
 
#include  " stdafx.h "
#include  < iostream >

#include <stdio.h>
#include <tchar.h>  


 using   namespace  std;
 // -----------------------------------------------
 void  GetMemory1( char   * p)
  {
    p  =  ( char   * )malloc( 100 );
}
 void  Test1( void )
  {
     char   * str  =  NULL;
    GetMemory1( str );
    strcpy(str,  " hello world " );
    printf(str);
}
 // -----------------------------------------------
 char   * GetMemory2( void )
  {  
     char  p[]  =   " hello world " ;
     return  p;
}
 void  Test2( void )
  {
     char   * str  =  NULL;
    str  =  GetMemory2(); 
    printf(str);
}
 // -----------------------------------------------
 void  GetMemory3( char   ** p,  int  num)
  {
     * p  =  ( char   * )malloc(num);
}
 void  Test3( void )
  {
     char   * str  =  NULL;
    GetMemory3( & str,  100 );
    strcpy(str,  " hello " ); 
    printf(str);   
}
 // -----------------------------------------------
 void  Test4( void )
  {
     char   * str  =  ( char   * ) malloc( 100 );
    strcpy(str,  " hello " );
    free(str);     
     if (str  !=  NULL)
      {
        strcpy(str,  " world " );
        printf(str);
    }
}
 // -----------------------------------------------
 main()
  {
     // -----------------------------------------------
     // 請問運行Test1函數會有什麼樣的結果?
     //
     // 答:程序崩潰。
     //
     // 因爲GetMemory並不能傳遞動態內存,
     //
     // Test函數中的 str一直都是 NULL。
     //
     // strcpy(str, "hello world");將使程序崩潰。
     Test1();
     // -----------------------------------------------
     //     請問運行Test2函數會有什麼樣的結果?
     //
     // 答:可能是亂碼。
     //
     // 因爲GetMemory返回的是指向“棧內存”的指針,
     // 該指針的地址不是 NULL,但其原現的內容已經被清除,新內容不可知。
     Test2();
     // -----------------------------------------------
     //     請問運行Test3函數會有什麼樣的結果?
     //
     // 答:
     //
     // (1)能夠輸出hello
     //
     // (2)內存泄漏
     Test3();
     // -----------------------------------------------
     //     請問運行Test函數會有什麼樣的結果?
     //
     // 答:篡改動態內存區的內容,後果難以預料,非常危險。
     //
     // 因爲free(str);之後,str成爲野指針,
     //
     // if(str != NULL)語句不起作用。
     Test4();
     // -----------------------------------------------
 }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章