關於C++野指針的問題

在作C++開發時,總避免不了與指針打交道,代碼一多,野指針就成了一個問題!就此,我專門研究了一下野指針,總結其規律,僅供你們參考一下。ios

咱們知道,代碼所得到的內存地址是系統所提供的虛擬內存地址,其與真正的物理內存地址之間存在着映射關係,也就是所謂的內存管理機制。對每個程序而言,都會的本身的獨立的內存空間(4G)。函數

考察下面兩段代碼:

/*

test1:file1.cc

野指針存在於main函數內,編譯能經過但會出現段錯誤

*/

include<iostream>

using std::cout;

using std::endl;

int main()

{

    int* p1;

    cout<<*p1<<endl;

return 0;

}

 

/*

test2:file2.cc

野指針存在於通常函數內,編譯能經過而且會輸出

該野指針所指向的值

*/

include<iostream>

using std::cout;

using std::endl;

void test()

{

   int* p2;

   cout<<*p2<<endl;

}

int main()

{

  test();

}

爲何野指針在mian函數中不能輸出其指向的值而在通常函數中卻能夠呢?很奇怪吧!!這其實一點都不奇怪!再來考察一下,這兩個野指針的地址值。發現p1=NULL;而p2=0xffde38(可能會是其餘的),因此想要得到指向NULL的值心定是會出現錯誤的。指針

 

那有人會問,爲何p2所指向的值爲何能夠輸出呢?爲解答這個問題,咱們再來看個例子。code

/*

test3:file3.cc

野指針存在於通常函數中,可是給它隨意賦個地址值0xddff45;

能經過編譯但也會出現錯誤

*/

#include<iostream>

using std::cout;

using std::endl;

void test()

{

    int* p3=(int*)0xddff45;

   cout<<*p<<endl;

}

int main()

{

     test();

return 0;

}

 

按照前面所說的,不給野指針賦值會獲得一個野地址,隨意賦個值也一樣是個野地址值,那爲何一個能輸出其所指向的值而另外一個卻不能呢?內存

這是由於,一個是系統給分配的,雖然也是個隨意的地址,可是仍然是處在本身的獨立內存內間裏的,也就是說到最後映射時,不會映射到其餘程序開發

所佔用的地址空間去。而人工隨意分配的話,通常都不會在本身的獨立內存空間裏面的,映射以後會跑到其餘程序所佔用的存在中去。內存管理

 

由此能夠,野指針其實不像日常咱們想的那樣可怕,只要它還處在本身的空間裏就是良性的。固然,這並非說鼓勵你們寫代碼時都是野指針,通常來說,當io

定義一個指針時,最好將其初始化爲NULL;這樣會好不少。編譯

相關文章
相關標籤/搜索