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

C語言的空類型指針,空指針,野指針詳解

 更新時間:2021年09月23日 15:12:19   作者:西紅柿炒蛋不吃西紅柿  
這篇文章主要介紹了C語言的空類型指針,空指針,野指針的詳解及用法示例,介紹了其相關(guān)概念,然后分享了幾種用法,具有一定參考價值。需要的朋友可以了解下。

空類型指針-void*

void是空類型,void*是空類型指針,又叫萬能指針,就是該指針能接收任意類型的指針,可以指向任何類型對象,所以不能對空類型指針進行解引用,必須強制類型轉(zhuǎn)換成相應(yīng)的指針類型,才能進行解引用操作。

空指針類型:

  • 作為函數(shù)形參類型,可以接收任意類型的指針;
  • 作為函數(shù)返回值類型,在函數(shù)外面,將其強制類型轉(zhuǎn)換為相應(yīng)的指針類型
  • 可以與另一個void*類型指針比較大小

注意:空類型指針不能進行解引用操作;不能進行±整數(shù)運算。

空指針-NULL

在C語言中,空指針NULL指的是地址為0的那塊空間

#define NULL((void*)0)

對于這塊空間是不準(zhǔn)我們進行訪問的,所以,對NULL是不能進行解引用操作的,所以每次對指針進行解引用操作之前,我們要判斷是否為空指針。

野指針

野指針是指向一個非法的或已銷毀的內(nèi)存的指針。

對野指針進行解引用操作是非法的。

造成野指針的原因

1.指針未初始化

int main()
{
	char* p;
	//此時p是野指針
	return 0;
}

沒有對指針p進行初始化,此時p就是野指針,如果此時對p進行解引用操作,非法訪問內(nèi)存,程序就會崩潰。

2.指針越界訪問

int main()
{
	int arr[] = {1,2,3,4,5};

	int* p = arr;

	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ",p[i]);
	}

	return 0;
}

雖然上面程序正常運行,但是其實越界訪問了;只是僅僅訪問了非法的內(nèi)存空間,沒有改變空間的值,程序有可能沒來得及報錯,但并不代表程序沒有錯,但是對于下面的代碼,程序就會崩潰:

int main()
{
	int arr[10] = {0};
	int i = 0;
	int* p = arr;

	for (i = 0; i <= 10; i++)
	{
		*p = i;
		p++;
	}

	return 0;
}

因為這里非法訪問內(nèi)存的同時試圖改變空間的值,所以程序崩潰。

3.指針指向的空間已經(jīng)釋放

char* fun()
{
	char arr[] = "abc";
	return arr;
}

int main()
{
	char* p = fun();
	printf("%s\n",p);
	return 0;
}

執(zhí)行程序,給出如下警告

在這里插入圖片描述

雖然程序沒有崩潰,但是這種寫法是非法的,arr是局部變量,函數(shù)調(diào)用結(jié)束,棧幀銷毀,局部變量空間歸還給操作系統(tǒng),我們沒有使用權(quán)限,此時p就是野指針,*p屬于非法訪問內(nèi)存。

避免野指針

1.指針要進行初始化

指針要有初始值,初始化為NULL,或者有具體的指向。

既然NULL也不能進行解引用操作,那么為什么可以將指針初始化為NULL?這里初始化為NULL,只是為了給指針一個指向,但是實際使用時,我們并不能對NULL進行解引用操作,所以使用指針之前才要有效性判斷。

2.使用指針之前要進行有效性判斷

使用指針之前,要判斷是否為NULL,如果為NULL,那么是不能進行解引用操作的

3.避免越界訪問

不要進行越界訪問操作,即使還是訪問不改變值也是非法的

4.不要返回局部變量的地址

局部變量空間在函數(shù)到調(diào)用結(jié)束,就歸還給操作系統(tǒng),如果返回局部變量的地址,函數(shù)外面接收該返回值的指針就變成了野指針

5.當(dāng)指針指向的空間釋放后,要將該指針置為NULL

這樣避免對野指針解引用操作,同時避免二次釋放動態(tài)開辟的內(nèi)存空間

int main()
{
	int* p = (int*)malloc(10*sizeof(int));
	
	//1.判斷有效性
	if (p == NULL)
	{
		return -1;
	}
	
	//2.使用指針
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		p[i] = i;
	}
	
	//3.釋放指針指向的空間
	free(p);

	//free(p);//非法操作
	//4.指針置為NULL
	p = NULL;

	free(p);//釋放空指針什么都不做

	return 0;
}

總結(jié)

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • 詳解C++編程中的私有繼承和公有繼承

    詳解C++編程中的私有繼承和公有繼承

    這篇文章主要介紹了詳解C++編程中的私有繼承和公有繼承,是C++入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-09-09
  • C語言中結(jié)構(gòu)體(struct)的幾種初始化方法

    C語言中結(jié)構(gòu)體(struct)的幾種初始化方法

    相信大家都知道struct結(jié)構(gòu)體是C語言中非常重要的復(fù)合類型,初始化的方法很多,那么小編下面對這些方法進行總結(jié),便于自己和大家以后查閱,有需要的可以參考借鑒。
    2016-08-08
  • C語言線性表之雙鏈表詳解

    C語言線性表之雙鏈表詳解

    這篇文章主要為大家詳細(xì)介紹了C語言線性表之雙鏈表,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • 淺析C++ 數(shù)據(jù)類型

    淺析C++ 數(shù)據(jù)類型

    這篇文章主要介紹了C++ 數(shù)據(jù)類型的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)c++,感興趣的朋友可以了解下
    2020-08-08
  • 利用QT實現(xiàn)UDP聊天小程序

    利用QT實現(xiàn)UDP聊天小程序

    這篇文章主要為大家詳細(xì)介紹了潤滑利用QT的UDP技術(shù),實現(xiàn)兩個QT程序之間的聊天程序。文中的示例代碼講解詳細(xì),感興趣的小伙伴可以學(xué)習(xí)一下
    2022-11-11
  • C語言實現(xiàn)簡單飛機大戰(zhàn)

    C語言實現(xiàn)簡單飛機大戰(zhàn)

    這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)簡單飛機大戰(zhàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • C++初階學(xué)習(xí)之模板進階

    C++初階學(xué)習(xí)之模板進階

    這篇文章主要為大家介紹了C++模板進階,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • C/C++判斷素數(shù)的三種方法

    C/C++判斷素數(shù)的三種方法

    這篇文章主要給大家介紹了C/C++判斷素數(shù)的三種方法,常規(guī)的函數(shù)判斷法,埃氏篩法和歐拉篩法這三種方法,并通過代碼示例講解的非常詳細(xì),具有一定的參考價值,需要的朋友可以參考下
    2023-12-12
  • 深入探究C++ string的內(nèi)部究竟是什么樣的

    深入探究C++ string的內(nèi)部究竟是什么樣的

    這篇文章主要給大家介紹了關(guān)于C++ string的內(nèi)部究竟是什么樣的,文中通過示例代碼的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • Visual Studio安裝的圖文教程

    Visual Studio安裝的圖文教程

    這篇文章主要介紹了Visual Studio安裝的圖文教程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02

最新評論

周至县| 武胜县| 娄底市| 惠东县| 娱乐| 富阳市| 新平| 新干县| 永泰县| 绩溪县| 项城市| 柘城县| 开平市| 蕉岭县| 天柱县| 峨山| 丰都县| 六枝特区| 长宁县| 普宁市| 新密市| 穆棱市| 大港区| 昭平县| 万山特区| 新密市| 赣榆县| 清原| 庄浪县| 丹江口市| 东阳市| 安徽省| 张北县| 奉节县| 和静县| 阿尔山市| 洱源县| 三河市| 阳春市| 六枝特区| 湘西|