// ----------------------------------------------- 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);} }
// -----------------------------------------------/* 請問運行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();// -----------------------------------------------
源地址:http://www.cppblog.com/mzty/archive/2006/07/07/9536.html