最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言基礎野指針與空指針示例分析

 更新時間:2021年11月18日 16:19:39   作者:RookieStriver  
全網(wǎng)最接地氣的C語言野指針介紹,此處對于野指針與空指針知識點做一些簡要的介紹,作者實屬初學,難免文章中有內(nèi)容理解不到位或者有不當之處,還請朋友們不吝指正,希望大家多多給予支持

一:野指針

概念:野指針就是指向的內(nèi)存地址是未知的(隨機的,不正確的,沒有明確限制的)。

說明:指針變量也是變量,是變量就可以任意賦值。但是,任意數(shù)值賦值給指針變量沒有意義,因為這樣的指針就成了野指針,此指針指向的區(qū)域是未知(操作系統(tǒng)不允許操作此指針指向的內(nèi)存區(qū)域)。

注:野指針不會直接引發(fā)錯誤,操作野指針指向的內(nèi)存區(qū)域才會出問題。

代碼示例:

int a = 100;
int *p;
p = a; //把a的值賦值給指針變量p,p為野指針, ok,不會有問題,但沒有意義

p = 0x12345678; //給指針變量p賦值,p為野指針, ok,不會有問題,但沒有意義

*p = 1000;  //對野指針進行賦值操作就不可以了

把a的值賦值給指針變量p,p為野指針, ok,不會有問題,但沒有意義。
給指針變量p賦值,p為野指針, ok,不會有問題,但沒有意義。

野指針的成因

1. 指針未初始化

指針變量剛被創(chuàng)建時不會自動成為NULL指針,它的缺省值是隨機的,它所指的空間是隨機的。

代碼示例:

int main()
{
	int * p;
	*p = 20;
	return 0;
}

(個人理解:指針變量有操作系統(tǒng)隨機賦值,未指向一個具體空間,沒有落腳點)

2. 指針越界訪問

指針指向的范圍超出了合理范圍,或者調(diào)用函數(shù)時返回指向棧內(nèi)存的指針或引用,因為棧內(nèi)存在函數(shù)結(jié)束時會被釋放。

代碼示例:

int main()
{
	int arr[10] = {0};
	int *p = arr;
	for(int i = 0; i <= 11; i++)
	{
		*(P++) = i;//當指針指向的范圍超出數(shù)組arr的范圍,p變成野指針。
	}
	return 0;
}

3 .指針釋放后未置空

有時指針在free或delete后未賦值 NULL,便會使人以為是合法的。其實它們只是把指針所指的內(nèi)存給釋放掉,但并沒有把指針本身忘記。此時指針指向的就是無效內(nèi)存。釋放后的指針應立即將指針置為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;
}

(個人理解:我們前一天住了個賓館,第二天退房了,雖然我們知道一個該房間的門牌號,但是保潔阿姨已經(jīng)收拾了房間,我們就不知道房間里具體是什么樣的了,所以我們也沒法操作了。)

規(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;//嚴格遵守有效范圍。
	}
	return 0;
}

3 避免返回局部變量的地址

代碼示例:

int * test()
{
	int a = 20;
	return &a;
}
int main()
{
	int *p = NULL;
	p = test();
	printf("%d\n", *p);
	return 0;
}

這與變量的作用域有關,局部變量存在棧區(qū),當被調(diào)函數(shù)結(jié)束后 ,棧區(qū)上局部變量的內(nèi)存空間被釋放,若再去訪問該空間就不合理了。

4. 開辟的指針釋放后置為NULL

當指針p指向的內(nèi)存空間釋放時,沒有設置指針p的值為NULL。free只是把內(nè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)成良好的編程習慣

好的編程習慣可以避免很多問題,道阻且長,但行則將至?。?!

二:空指針

*NULL是一個值為0的宏常量:#define NULL ((void )0)

意義:為了標志指針變量沒有指向任何變量(空閑可用),在C語言中,通常把NULL賦值給此指針,這樣就標志此指針為空指針,沒有指向任何空間。

注意:對指針解引用操作可以獲得它所指向的值。但從定義上看,NULL指針并未指向任何東西,因為對一個NULL指針解引用是一個非法的操作,所以在解引用之前,必須確保它不是一個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!!!觀眾老爺們,這里只是介紹了野指針與空指針,如果朋友們覺得有一點點作用的話,希望朋友們能夠給予小菜鳥一點支持!后續(xù)繼續(xù)給朋友們帶來更好的博文,還希望朋友們能夠繼續(xù)關注,小菜鳥致力于把自己的學習經(jīng)驗與個人理解更多的分享給大家,望大家喜歡與指正,希望大家以后多多支持腳本之家!

相關文章

  • c語言的cps實現(xiàn)求fibonacci數(shù)列示例

    c語言的cps實現(xiàn)求fibonacci數(shù)列示例

    這篇文章主要介紹了c語言的cps實現(xiàn)求fibonacci數(shù)列示例,需要的朋友可以參考下
    2014-03-03
  • C語言使用鏈表實現(xiàn)學生信息管理系統(tǒng)

    C語言使用鏈表實現(xiàn)學生信息管理系統(tǒng)

    這篇文章主要為大家詳細介紹了C語言使用鏈表實現(xiàn)學生信息管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • C++實現(xiàn)單張圖片讀取和保存

    C++實現(xiàn)單張圖片讀取和保存

    這篇文章主要為大家詳細介紹了C++語言讀取和保存單張圖片的代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-09-09
  • 淺談c++如何實現(xiàn)并發(fā)中的Barrier

    淺談c++如何實現(xiàn)并發(fā)中的Barrier

    這篇文章主要介紹了淺談c++如何實現(xiàn)并發(fā)中的Barrier,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-07-07
  • C語言折半查找法的超詳細講解

    C語言折半查找法的超詳細講解

    折半查找法也叫做?分查找,顧名思義就是把數(shù)據(jù)分成兩半,再判斷所查找的key在哪?半中,再重復上述步驟知道找到?標key,下面這篇文章主要給大家介紹了關于C語言折半查找法的相關資料,需要的朋友可以參考下
    2022-06-06
  • Qt?關于容器的遍歷迭代器的使用問題小結(jié)

    Qt?關于容器的遍歷迭代器的使用問題小結(jié)

    Qt是一個跨平臺的 C++ 開發(fā)庫,主要用來開發(fā)圖形用戶界面程序,當然也可以開發(fā)不帶界面的命令行程序,本文重點給大家介紹Qt?關于容器的遍歷迭代器的使用問題小結(jié),感興趣的朋友一起看看吧
    2022-03-03
  • 詳解C語言實現(xiàn)猜數(shù)字游戲

    詳解C語言實現(xiàn)猜數(shù)字游戲

    這篇文章主要為大家介紹了C語言實現(xiàn)猜數(shù)字游戲,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助<BR>
    2022-01-01
  • C語言 棧的表示和實現(xiàn)詳細介紹

    C語言 棧的表示和實現(xiàn)詳細介紹

    這篇文章主要介紹了C語言 棧的表示和實現(xiàn)詳細介紹的相關資料,需要的朋友可以參考下
    2016-12-12
  • C++實現(xiàn)LeetCode(76.最小窗口子串)

    C++實現(xiàn)LeetCode(76.最小窗口子串)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(76.最小窗口子串),本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C語言實現(xiàn)職工工資管理系統(tǒng)的示例代碼

    C語言實現(xiàn)職工工資管理系統(tǒng)的示例代碼

    這篇文章主要為大家詳細介紹了C語言如何實現(xiàn)職工工資管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08

最新評論

台湾省| 乌鲁木齐县| 天峻县| 白玉县| 罗源县| 开封县| 永善县| 治县。| 彭州市| 东兴市| 密山市| 丰城市| 苏尼特右旗| 微山县| 城市| 绥芬河市| 三明市| 梧州市| 苏尼特左旗| 长宁县| 聂拉木县| 石城县| 阿拉尔市| 密山市| 临江市| 青岛市| 高密市| 柘荣县| 万载县| 宜兰市| 镇沅| 德保县| 崇明县| 珠海市| 太湖县| 二连浩特市| 尉氏县| 石河子市| 平乐县| 邳州市| 商洛市|