野指針的危害—引用和指針(四)

目錄

 

“野指針”的定義

野指針的成因

野指針變量不可以被賦值

野指針不能用於變量值的互換


“野指針”的定義

野指針不是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;
}

運行如下:

單純的考慮交換值,很小兒科對吧! 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章