避免野指標的產生
「野指標」的成因主要有:
1)指標變數沒有被初始化。任何指標變數剛被建立時不會自動成為null指標,它的預設值是隨機的,它會亂指一氣。所以,指標變數在建立的同時應當被初始化,要麼將指標設定為null,要麼讓它指向合法的記憶體。
char *p; //2)指標p被free或者delete之後,沒有置為null,讓人誤以為p是個合法的指標.此時p為野指標
char *p=new3)指標操作超越了變數的作用範圍。char[10]; //
指向堆中分配的記憶體首位址,p儲存在棧區
cin>>p;
delete p; //
p重新變為野指標
char *p=new指標的注意點:a.指標指向常量儲存區物件char[10]; //
指向堆中分配的記憶體首位址
cin>>p;
cout
<
可能輸出未知資料
char *p="此時p指向的是乙個字串常量,不能對*p的內容進行寫操作,如srtcpy(p,s)是錯誤的,因為p的內容為「abc」字串常量,該資料儲存在常量儲存區,但可以對指標p進行操作,讓其指向其他的記憶體空間。abc";
b.資源洩漏
問題:
1 #include2結果:卡死using
namespace
std;
3void
main()
4
改進:
1 #include2結果:正確using
namespace
std;
3void
main()
4
c.記憶體越界
1d.返回值是指標問題:陣列p中的內容為「hello world」,儲存在棧區,函式結束時內容被清除,p變為野指標,可能導致亂碼char *p=new
char[3]; //
分配三個字元空間,p指向該記憶體空間
2 strcpy(p,"
abcd
"); //
將abcd存處在分配的記憶體空間中,由於strlen("abcd")=4>3,越界
3delete p; //ok
1 #include2結果:using
namespace
std;
3char *f()48
void
main()
9
改進:
1.加static限定,延長陣列生存期
1 #include2結果:using
namespace
std;
3char *f()48
void
main()
9
2.定義成指標型陣列
1 #include2結果:using
namespace
std;
3char *f()48
void
main()
9
3.動態分配儲存空間,儲存在堆區
1 #include2結果:using
namespace
std;
3char *f()49
void
main()
10
e.指標做形參
即所謂的位址傳遞,我們都知道位址傳遞的方式,形參的改變會導致實參的改變,但要注意的是,這裡的改變是指指標所指內容的改變,而不是指標值的改變。因此,當形參改變會導致實參改變時,指標所指的內容是非const型別的,否則會出錯。
1.改變指標內容:
12.改變指標值:void swap(int *a,int *b) //
交換的是*a,*b,即指標的內容,而不是指標a,b
2
1 #include2結果:using
namespace
std;
3void fun(char *p)47
void
main()
8
繼續看下面的情況,修改指標的內容:
1 #include2結果:using
namespace
std;
3void fun(char *p)47
void
main()
8
注:p="ab"和strcpy(p,"ab"),含義不一樣,前者指標p指向常量「ab」儲存區域的首位址,改變了p最開始指向的new申請的記憶體空間;而後者是將「ab」分配到new申請的記憶體空間中;
野指標及c 指標使用注意點
避免野指標的產生 野指標 的成因主要有 1 指標變數沒有被初始化。任何指標變數剛被建立時不會自動成為null指標,它的預設值是隨機的,它會亂指一氣。所以,指標變數在建立的同時應當被初始化,要麼將指標設定為null,要麼讓它指向合法的記憶體。char p 此時p為野指標2 指標p被free或者dele...
c 空指標,野指標
當給空指標所指的位址賦值時,會報錯 int p nullptr p 10 int p 野指標,未初始化int p new int delete p 刪除後不知道p指向 include using namespace std class a void a func void void test voi...
C 空懸指標 野指標
指向已經被釋放的記憶體 或者 指向已經被銷毀的物件。情況一 變數c釋放,dp變成空懸指標 情況二 void func 當free或者delete呼叫時,除了釋放動態申請的記憶體,還要將相關的指標指向null,避免出現空懸指標 情況三 int func void num是基於棧的變數,當func函式返...