欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語言基礎(chǔ)野指針與空指針示例分析

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

一:野指針

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

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

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

代碼示例:

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

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

*p = 1000;  //對(duì)野指針進(jìn)行賦值操作就不可以了

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

野指針的成因

1. 指針未初始化

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

代碼示例:

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

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

2. 指針越界訪問

指針指向的范圍超出了合理范圍,或者調(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)存給釋放掉,但并沒有把指針本身忘記。此時(shí)指針指向的就是無效內(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)收拾了房間,我們就不知道房間里具體是什么樣的了,所以我們也沒法操作了。)

規(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)存空間被釋放,若再去訪問該空間就不合理了。

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

當(dāng)指針p指向的內(nèi)存空間釋放時(shí),沒有設(shè)置指針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)成良好的編程習(xí)慣

好的編程習(xí)慣可以避免很多問題,道阻且長(zhǎng),但行則將至?。?!

二:空指針

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

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

注意:對(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!!!觀眾老爺們,這里只是介紹了野指針與空指針,如果朋友們覺得有一點(diǎn)點(diǎn)作用的話,希望朋友們能夠給予小菜鳥一點(diǎn)支持!后續(xù)繼續(xù)給朋友們帶來更好的博文,還希望朋友們能夠繼續(xù)關(guān)注,小菜鳥致力于把自己的學(xué)習(xí)經(jīng)驗(yàn)與個(gè)人理解更多的分享給大家,望大家喜歡與指正,希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語言實(shí)現(xiàn)2048游戲代碼

    C語言實(shí)現(xiàn)2048游戲代碼

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)2048游戲代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • 查找算法之二分查找的C++實(shí)現(xiàn)

    查找算法之二分查找的C++實(shí)現(xiàn)

    今天小編就為大家分享一篇關(guān)于查找算法之二分查找的C++實(shí)現(xiàn),小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • 深入解析C++中的引用類型

    深入解析C++中的引用類型

    引用指的是對(duì)一個(gè)對(duì)象的引用。那么什么是對(duì)象?在c++中狹義的對(duì)象指的是用類,結(jié)構(gòu),聯(lián)合等復(fù)雜數(shù)據(jù)類型來聲明的變量,如 MyClass myclass,CDialog mydlg,等等
    2013-09-09
  • Qt網(wǎng)絡(luò)編程之TCP通信及常見問題

    Qt網(wǎng)絡(luò)編程之TCP通信及常見問題

    這篇文章主要為大家詳細(xì)介紹了Qt網(wǎng)絡(luò)編程之TCP通信及常見問題,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • C/C++ Qt 自定義Dialog對(duì)話框組件應(yīng)用案例詳解

    C/C++ Qt 自定義Dialog對(duì)話框組件應(yīng)用案例詳解

    有時(shí)候我們需要一次性修改多個(gè)數(shù)據(jù),使用默認(rèn)的模態(tài)對(duì)話框似乎不太夠用,此時(shí)我們需要自己創(chuàng)建一個(gè)自定義對(duì)話框。這篇文章主要介紹了Qt自定義Dialog對(duì)話框組件的應(yīng)用,感興趣的同學(xué)可以學(xué)習(xí)一下
    2021-11-11
  • 淺談C++指針(必看)

    淺談C++指針(必看)

    下面小編就為大家?guī)硪黄獪\談C++指針(必看)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-06-06
  • C++單例模式的實(shí)例詳解

    C++單例模式的實(shí)例詳解

    這篇文章主要介紹了C++單例模式的實(shí)例詳解的相關(guān)資料,希望通過本文能幫助到大家,讓大家掌握這部分內(nèi)容,需要的朋友可以參考下
    2017-10-10
  • C語言實(shí)現(xiàn)單鏈表實(shí)現(xiàn)方法

    C語言實(shí)現(xiàn)單鏈表實(shí)現(xiàn)方法

    這篇文章主要介紹了C語言實(shí)現(xiàn)單鏈表實(shí)現(xiàn)方法的相關(guān)資料,鏈表分為單向鏈表、雙向鏈表、循環(huán)鏈表,需要的朋友可以參考下
    2017-08-08
  • C語言實(shí)現(xiàn)bmp圖像平移操作

    C語言實(shí)現(xiàn)bmp圖像平移操作

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)bmp圖像平移操作,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • C++結(jié)構(gòu)體字節(jié)對(duì)齊和共用體大小

    C++結(jié)構(gòu)體字節(jié)對(duì)齊和共用體大小

    這篇文章主要介紹了C++結(jié)構(gòu)體字節(jié)對(duì)齊和共用體大小,結(jié)構(gòu)體內(nèi)存對(duì)齊在筆試和面試中經(jīng)常被問到,所以這篇文章做個(gè)總結(jié),首先通過代碼驗(yàn)證不同結(jié)構(gòu)體的內(nèi)存大小,需要的朋友可以參考下
    2021-11-11

最新評(píng)論