C++ 指针 指针高级<高质量编程>

 

// ----------------------------------------------- 
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 

原文地址:https://www.cnblogs.com/linlf03/p/2252613.html