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

溫馨提示×

溫馨提示×

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

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

C語言的野指針與空指針是什么

發布時間:2021-11-19 09:04:37 來源:億速云 閱讀:119 作者:iii 欄目:開發技術

這篇文章主要介紹“C語言的野指針與空指針是什么”,在日常操作中,相信很多人在C語言的野指針與空指針是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”C語言的野指針與空指針是什么”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

    一:野指針

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

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

    注:野指針不會直接引發錯誤,操作野指針指向的內存區域才會出問題。

    代碼示例:

    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.1 :野指針的成因

    1. 指針未初始化:指針變量剛被創建時不會自動成為NULL指針,它的缺省值是隨機的,它所指的空間是隨機的。

    代碼示例:

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

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

    2. 指針越界訪問:指針指向的范圍超出了合理范圍,或者調用函數時返回指向棧內存的指針或引用,因為棧內存在函數結束時會被釋放。

    代碼示例:

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

    3 .指針釋放后未置空:有時指針在free或delete后未賦值 NULL,便會使人以為是合法的。其實它們只是把指針所指的內存給釋放掉,但并沒有把指針本身忘記。此時指針指向的就是無效內存。釋放后的指針應立即將指針置為NULL,防止產生“野指針”。

    代碼示例:

    int main()
    {
    	int *p = NULL;
    	p = malloc(10 * sizeof(int));
    	if (!p)
    	{
    		return;
    	}
    	//成功開辟內存,可以操作內存。
    	free(p);
    	p = NULL;
    	return 0;
    }

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

    2.1 :規避野指針

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

    這與變量的作用域有關,局部變量存在棧區,當被調函數結束后 ,棧區上局部變量的內存空間被釋放,若再去訪問該空間就不合理了。

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

    當指針p指向的內存空間釋放時,沒有設置指針p的值為NULL。free只是把內存空間釋放了,但是并沒有將指針p的值賦為NULL。

    代碼示例:

    int main()
    {
    	int *p = NULL;
    	p = malloc(10 * sizeof(int));
    	if (!p)
    	{
    		return;
    	}
    	//成功開辟內存,可以操作內存。
    	free(p);
    	p = NULL;//避免野指針
    	return 0;
    }

    5. 養成良好的編程習慣

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

    二:空指針

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

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

    注意:對指針解引用操作可以獲得它所指向的值。但從定義上看,NULL指針并未指向任何東西,因為對一個NULL指針解引用是一個非法的操作,所以在解引用之前,必須確保它不是一個NULL指針。

    代碼示例:

    void test(){
    	char *p = NULL;
    	**//給p指向的內存區域拷貝內容**
    	strcpy(p, "1111"); //err
    	char *q = 0x1122;
    	//給q指向的內存區域拷貝內容
    	strcpy(q, "2222"); //err		
    }

    到此,關于“C語言的野指針與空指針是什么”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

    向AI問一下細節

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

    AI

    乐清市| 克拉玛依市| 弥渡县| 万宁市| 库车县| 板桥市| 潼南县| 金乡县| 长沙县| 吉安县| 右玉县| 镇坪县| 德州市| 隆尧县| 龙门县| 绥棱县| 信阳市| 南和县| 满洲里市| 九江县| 尼玛县| 汾阳市| 云浮市| 浪卡子县| 杭锦后旗| 博野县| 锦州市| 澜沧| 广汉市| 庆阳市| 弋阳县| 大丰市| 清原| 雷州市| 泰和县| 水富县| 沁阳市| 论坛| 海口市| 宣武区| 济阳县|