目錄
“野指針”的定義
野指針不是NULL指針,而是指向垃圾內存的指針。野指針可以很容易被if語句來判斷出來,如果發現if對某個指針不起作用,可以懷疑這個指針是野指針。
野指針的成因
忘了將指針初始化。任何指針在剛創建的時候,不會自動變成NULL的,裏面其實都是隨機值,或者說是垃圾值,必須人爲的進行初始化纔行。
指針被free或delete之後,沒有置爲NULL,讓人誤以爲是合法的,但其實裏面也是垃圾值。也必須人爲的進行初始化纔行。
野指針變量不可以被賦值
給野指針賦值的時候,編譯器會報錯:
野指針不能用於變量值的互換
和上面的問題一樣,沒有被初始化的指針,是不會被編譯器通過的。
那是不是將其初始化後,就可以了呢?
#include <stdio.h>
#include <iostream>
using namespace std;
int main()
{
int* p = NULL;
int a = 1;
int b = 2;
*p = b;
b = a;
a = *p;
system("pause");
return 0;
}
會成功嗎?還是報錯:
這就要說到另一個非常常見的錯誤了,定義一個指針:"int *p",p是指針變量,*p,是p所指向內存空間所存放的內容,而當進行完初始化後"int *p = NULL;",一定要注意,這個初始化的是指針變量p,當初始化結束後,變成了:p這個指針變量中存放的內容爲NULL,此時的*p,表示內存地址爲NULL的地址中所存放的內容,但這個地址存在嗎?肯定不存在,所以,當以*p作爲操作對象進行操作的時候,很顯然照樣報錯,一般我們都是給指針變量賦值,或者給有實際指向的指針所指向的內容賦值:
#include <stdio.h>
#include <iostream>
using namespace std;
int main()
{
int* p = NULL;
int a = 1;
int b = 2;
int c = 3;
printf("a:%d,b:%d,c:%d\n", a, b, c);
p = &b; //對指針變量進行操作
b = a;
a = *p;
*p = c; //經過上面對p的修改,*p,不是表示NULL所指向的內存內容了,所以,可以被作爲左值被使用了!
printf("a:%d,b:%d,c:%d\n", a, b, *p);
system("pause");
return 0;
}
運行結果:
當然,話說回來,我們要實現兩值交換,現在一直沒弄,下面給弄下哈:
#include <stdio.h>
#include <iostream>
using namespace std;
int main()
{
int* p = NULL;
int a = 1;
int b = 2;
int c;
printf("a:%d,b:%d\n", a, b);
c = b;
b = a;
a = c;
printf("a:%d,b:%d\n", a, b);
system("pause");
return 0;
}
運行如下:
單純的考慮交換值,很小兒科對吧!