指針高級--<高質量編程>
//
?execise2.cpp?:?Defines?the?entry?point?for?the?console?application.
//
#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();
????
//
-----------------------------------------------
}
歡迎大家來發表自己的看法:
posted on 2006-07-07 13:17 夢在天涯 閱讀(1501) 評論(5) 編輯 收藏 引用 所屬分類: CPlusPlus

