在作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;這樣會好不少。編譯