91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C語言空類型中指針和空指針以及野指針的作用是什么

發布時間:2021-09-24 17:32:01 來源:億速云 閱讀:415 作者:柒染 欄目:開發技術

C語言空類型中指針和空指針以及野指針的作用是什么,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

    空類型指針-void*

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

    空指針類型:

    • 作為函數形參類型,可以接收任意類型的指針;

    • 作為函數返回值類型,在函數外面,將其強制類型轉換為相應的指針類型

    • 可以與另一個void*類型指針比較大小

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

    空指針-NULL

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

    #define NULL((void*)0)

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

    野指針

    野指針是指向一個非法的或已銷毀的內存的指針。

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

    造成野指針的原因

    1.指針未初始化
    int main()
    {
    	char* p;
    	//此時p是野指針
    	return 0;
    }

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

    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;
    }

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

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

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

    3.指針指向的空間已經釋放
    char* fun()
    {
    	char arr[] = "abc";
    	return arr;
    }
    
    int main()
    {
    	char* p = fun();
    	printf("%s\n",p);
    	return 0;
    }

    執行程序,給出如下警告

    C語言空類型中指針和空指針以及野指針的作用是什么

    雖然程序沒有崩潰,但是這種寫法是非法的,arr是局部變量,函數調用結束,棧幀銷毀,局部變量空間歸還給操作系統,我們沒有使用權限,此時p就是野指針,*p屬于非法訪問內存。

    避免野指針

    1.指針要進行初始化

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

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

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

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

    3.避免越界訪問

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

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

    局部變量空間在函數到調用結束,就歸還給操作系統,如果返回局部變量的地址,函數外面接收該返回值的指針就變成了野指針

    5.當指針指向的空間釋放后,要將該指針置為NULL

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

    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;
    }

    看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    南木林县| 泰宁县| 涟水县| 东港市| 嘉黎县| 奎屯市| 右玉县| 广灵县| 玉树县| 筠连县| 宜黄县| 建德市| 棋牌| 乳山市| 双辽市| 青海省| 沾化县| 鹤庆县| 孝感市| 乌什县| 桓台县| 普安县| 桦川县| 黄冈市| 宜宾县| 玉龙| 忻州市| 青州市| 清流县| 大埔县| 山丹县| 长子县| 略阳县| 白河县| 习水县| 盈江县| 湖北省| 龙海市| 库伦旗| 富平县| 津市市|