野指標及c 指標使用注意點

2022-07-29 05:45:10 字數 3291 閱讀 8694

避免野指標的產生

「野指標」的成因主要有:

1)指標變數沒有被初始化。任何指標變數剛被建立時不會自動成為null指標,它的預設值是隨機的,它會亂指一氣。所以,指標變數在建立的同時應當被初始化,要麼將指標設定為null,要麼讓它指向合法的記憶體。

char *p; //

此時p為野指標

2)指標p被free或者delete之後,沒有置為null,讓人誤以為p是個合法的指標.

char *p=new

char[10]; //

指向堆中分配的記憶體首位址,p儲存在棧區

cin>>p;

delete p; //

p重新變為野指標

3)指標操作超越了變數的作用範圍。          

char *p=new

char[10]; //

指向堆中分配的記憶體首位址

cin>>p;

cout

<

可能輸出未知資料

指標的注意點:a.指標指向常量儲存區物件

char *p="

abc";

此時p指向的是乙個字串常量,不能對*p的內容進行寫操作,如srtcpy(p,s)是錯誤的,因為p的內容為「abc」字串常量,該資料儲存在常量儲存區,但可以對指標p進行操作,讓其指向其他的記憶體空間。

b.資源洩漏

問題:

1 #include2

using

namespace

std;

3void

main()

4

結果:卡死

改進:

1 #include2

using

namespace

std;

3void

main()

4

結果:正確

c.記憶體越界

1

char *p=new

char[3]; //

分配三個字元空間,p指向該記憶體空間

2 strcpy(p,"

abcd

"); //

將abcd存處在分配的記憶體空間中,由於strlen("abcd")=4>3,越界

3delete p; //ok

d.返回值是指標問題:陣列p中的內容為「hello world」,儲存在棧區,函式結束時內容被清除,p變為野指標,可能導致亂碼

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.改變指標內容:

1

void swap(int *a,int *b) //

交換的是*a,*b,即指標的內容,而不是指標a,b

2

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函式返...