// 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();
// -----------------------------------------------
}