C語(yǔ)言基礎(chǔ)野指針與空指針示例分析
一:野指針
概念:野指針就是指向的內(nèi)存地址是未知的(隨機(jī)的,不正確的,沒(méi)有明確限制的)。
說(shuō)明:指針變量也是變量,是變量就可以任意賦值。但是,任意數(shù)值賦值給指針變量沒(méi)有意義,因?yàn)檫@樣的指針就成了野指針,此指針指向的區(qū)域是未知(操作系統(tǒng)不允許操作此指針指向的內(nèi)存區(qū)域)。
注:野指針不會(huì)直接引發(fā)錯(cuò)誤,操作野指針指向的內(nèi)存區(qū)域才會(huì)出問(wèn)題。
代碼示例:
int a = 100; int *p; p = a; //把a(bǔ)的值賦值給指針變量p,p為野指針, ok,不會(huì)有問(wèn)題,但沒(méi)有意義 p = 0x12345678; //給指針變量p賦值,p為野指針, ok,不會(huì)有問(wèn)題,但沒(méi)有意義 *p = 1000; //對(duì)野指針進(jìn)行賦值操作就不可以了
把a(bǔ)的值賦值給指針變量p,p為野指針, ok,不會(huì)有問(wèn)題,但沒(méi)有意義。
給指針變量p賦值,p為野指針, ok,不會(huì)有問(wèn)題,但沒(méi)有意義。
野指針的成因
1. 指針未初始化
指針變量剛被創(chuàng)建時(shí)不會(huì)自動(dòng)成為NULL指針,它的缺省值是隨機(jī)的,它所指的空間是隨機(jī)的。
代碼示例:
int main()
{
int * p;
*p = 20;
return 0;
}
(個(gè)人理解:指針變量有操作系統(tǒng)隨機(jī)賦值,未指向一個(gè)具體空間,沒(méi)有落腳點(diǎn))
2. 指針越界訪問(wèn)
指針指向的范圍超出了合理范圍,或者調(diào)用函數(shù)時(shí)返回指向棧內(nèi)存的指針或引用,因?yàn)闂?nèi)存在函數(shù)結(jié)束時(shí)會(huì)被釋放。
代碼示例:
int main()
{
int arr[10] = {0};
int *p = arr;
for(int i = 0; i <= 11; i++)
{
*(P++) = i;//當(dāng)指針指向的范圍超出數(shù)組arr的范圍,p變成野指針。
}
return 0;
}
3 .指針釋放后未置空
有時(shí)指針在free或delete后未賦值 NULL,便會(huì)使人以為是合法的。其實(shí)它們只是把指針?biāo)傅膬?nèi)存給釋放掉,但并沒(méi)有把指針本身忘記。此時(shí)指針指向的就是無(wú)效內(nèi)存。釋放后的指針應(yīng)立即將指針置為NULL,防止產(chǎn)生“野指針”。
代碼示例:
int main()
{
int *p = NULL;
p = malloc(10 * sizeof(int));
if (!p)
{
return;
}
//成功開辟內(nèi)存,可以操作內(nèi)存。
free(p);
p = NULL;
return 0;
}
(個(gè)人理解:我們前一天住了個(gè)賓館,第二天退房了,雖然我們知道一個(gè)該房間的門牌號(hào),但是保潔阿姨已經(jīng)收拾了房間,我們就不知道房間里具體是什么樣的了,所以我們也沒(méi)法操作了。)
規(guī)避野指針
1. 初始化指針
代碼示例:
int main()
{
int *p = NULL;
int a = 10;
p = &a;
*p = 20;
return 0;
}
2. 避免指針越界
代碼示例:
int main()
{
int arr[10] = {0};
int *p = arr;
for(int i = 0; i < 10; i++)
{
*(P++) = i;//嚴(yán)格遵守有效范圍。
}
return 0;
}
3 避免返回局部變量的地址
代碼示例:
int * test()
{
int a = 20;
return &a;
}
int main()
{
int *p = NULL;
p = test();
printf("%d\n", *p);
return 0;
}
這與變量的作用域有關(guān),局部變量存在棧區(qū),當(dāng)被調(diào)函數(shù)結(jié)束后 ,棧區(qū)上局部變量的內(nèi)存空間被釋放,若再去訪問(wèn)該空間就不合理了。
4. 開辟的指針釋放后置為NULL
當(dāng)指針p指向的內(nèi)存空間釋放時(shí),沒(méi)有設(shè)置指針p的值為NULL。free只是把內(nèi)存空間釋放了,但是并沒(méi)有將指針p的值賦為NULL。
代碼示例:
int main()
{
int *p = NULL;
p = malloc(10 * sizeof(int));
if (!p)
{
return;
}
//成功開辟內(nèi)存,可以操作內(nèi)存。
free(p);
p = NULL;//避免野指針
return 0;
}
5. 養(yǎng)成良好的編程習(xí)慣
好的編程習(xí)慣可以避免很多問(wèn)題,道阻且長(zhǎng),但行則將至!??!
二:空指針
*NULL是一個(gè)值為0的宏常量:#define NULL ((void )0)
意義:為了標(biāo)志指針變量沒(méi)有指向任何變量(空閑可用),在C語(yǔ)言中,通常把NULL賦值給此指針,這樣就標(biāo)志此指針為空指針,沒(méi)有指向任何空間。
注意:對(duì)指針解引用操作可以獲得它所指向的值。但從定義上看,NULL指針并未指向任何東西,因?yàn)閷?duì)一個(gè)NULL指針解引用是一個(gè)非法的操作,所以在解引用之前,必須確保它不是一個(gè)NULL指針。
代碼示例:
void test(){
char *p = NULL;
**//給p指向的內(nèi)存區(qū)域拷貝內(nèi)容**
strcpy(p, "1111"); //err
char *q = 0x1122;
//給q指向的內(nèi)存區(qū)域拷貝內(nèi)容
strcpy(q, "2222"); //err
}
OK!!!觀眾老爺們,這里只是介紹了野指針與空指針,如果朋友們覺(jué)得有一點(diǎn)點(diǎn)作用的話,希望朋友們能夠給予小菜鳥一點(diǎn)支持!后續(xù)繼續(xù)給朋友們帶來(lái)更好的博文,還希望朋友們能夠繼續(xù)關(guān)注,小菜鳥致力于把自己的學(xué)習(xí)經(jīng)驗(yàn)與個(gè)人理解更多的分享給大家,望大家喜歡與指正,希望大家以后多多支持腳本之家!
相關(guān)文章
c語(yǔ)言的cps實(shí)現(xiàn)求fibonacci數(shù)列示例
這篇文章主要介紹了c語(yǔ)言的cps實(shí)現(xiàn)求fibonacci數(shù)列示例,需要的朋友可以參考下2014-03-03
C語(yǔ)言使用鏈表實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言使用鏈表實(shí)現(xiàn)學(xué)生信息管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-12-12
淺談c++如何實(shí)現(xiàn)并發(fā)中的Barrier
這篇文章主要介紹了淺談c++如何實(shí)現(xiàn)并發(fā)中的Barrier,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07
Qt?關(guān)于容器的遍歷迭代器的使用問(wèn)題小結(jié)
Qt是一個(gè)跨平臺(tái)的 C++ 開發(fā)庫(kù),主要用來(lái)開發(fā)圖形用戶界面程序,當(dāng)然也可以開發(fā)不帶界面的命令行程序,本文重點(diǎn)給大家介紹Qt?關(guān)于容器的遍歷迭代器的使用問(wèn)題小結(jié),感興趣的朋友一起看看吧2022-03-03
詳解C語(yǔ)言實(shí)現(xiàn)猜數(shù)字游戲
這篇文章主要為大家介紹了C語(yǔ)言實(shí)現(xiàn)猜數(shù)字游戲,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助<BR>2022-01-01
C語(yǔ)言 棧的表示和實(shí)現(xiàn)詳細(xì)介紹
這篇文章主要介紹了C語(yǔ)言 棧的表示和實(shí)現(xiàn)詳細(xì)介紹的相關(guān)資料,需要的朋友可以參考下2016-12-12
C++實(shí)現(xiàn)LeetCode(76.最小窗口子串)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(76.最小窗口子串),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07
C語(yǔ)言實(shí)現(xiàn)職工工資管理系統(tǒng)的示例代碼
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言如何實(shí)現(xiàn)職工工資管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08

