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













































































































