避免野指標的產生
「野指標」的成因主要有:
1)指標變數沒有被初始化。任何指標變數剛被建立時不會自動成為null指標,它的預設值是隨機的,它會亂指一氣。所以,指標變數在建立的同時應當被初始化,要麼將指標設定為null,要麼讓它指向合法的記憶體。
char *p; //此時p為野指標2)指標p被free或者delete之後,沒有置為null,讓人誤以為p是個合法的指標.
char *p=new char[10]; //指向堆中分配的記憶體首位址,p儲存在棧區3)指標操作超越了變數的作用範圍。cin>> p;
delete p; //p重新變為野指標
char *p=new char[10]; //指向堆中分配的記憶體首位址此時p指向的是乙個字串常量,不能對*p的內容進行寫操作,如srtcpy(p,s)是錯誤的,因為p的內容為「abc」字串常量,該資料儲存在常量儲存區,但可以對指標p進行操作,讓其指向其他的記憶體空間。cin>> p;
cout<指標的注意點:
a.指標指向常量儲存區物件
char *p="abc";
b.資源洩漏
問題:
1 #include2 using namespace std;結果:卡死3 void main()
4
改進:
1 #include2 using namespace std;結果:正確3 void main()
4
c.記憶體越界
1 char *p=new char[3]; //分配三個字元空間,p指向該記憶體空間d.返回值是指標問題:陣列p中的內容為「hello world」,儲存在棧區,函式結束時內容被清除,p變為野指標,可能導致亂碼2 strcpy(p,"abcd"); //將abcd存處在分配的記憶體空間中,由於strlen("abcd")=4>3,越界
3 delete p; //ok
1 #include2 using namespace std;2.改變指標值:3 char *f()
4 8 void main()
9 8 void main()
9 8 void main()
9 9 void main()
10
1 #include2 using namespace std;3 void fun(char *p)
4 7 void main()
8 7 void main()
8 {9 char *p="abc"; //p指向常量"abc"
10 fun(p);
11 cout<
結果:
注:p="ab"和strcpy(p,"ab"),含義不一樣,前者指標p指向常量「ab」儲存區域的首位址,改變了p最開始指向的new申請的記憶體空間;而後者是將「ab」分配到new申請的記憶體空間中;
野指標及c 指標使用注意點
避免野指標的產生 野指標 的成因主要有 1 指標變數沒有被初始化。任何指標變數剛被建立時不會自動成為null指標,它的預設值是隨機的,它會亂指一氣。所以,指標變數在建立的同時應當被初始化,要麼將指標設定為null,要麼讓它指向合法的記憶體。char p 此時p為野指標 2 指標p被free或者del...
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函式返...