高质量编程--动态内存传递疑问解析
#include " stdafx.h " #include < iostream > 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();
//-----------------------------------------------