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

C語言指針類型與野指針引起的原因

 更新時間:2023年02月11日 08:54:53   作者:悲傷的豬大腸9  
我們C語言獨一無二的特色——指針。說起指針,可能很多人都是還沒學(xué)就已經(jīng)聽說過其鼎鼎大名,因為有很多傳言和玩笑什么的說指針很難,其實大家大可不必有畏難情緒,指針這個東西雖然確實有一定難度,但是這是基于其優(yōu)秀的靈活性而衍生的一點小問題

一、指針是什么

指針也就是 內(nèi)存地址 ,在計算機上我們訪問數(shù)據(jù)需要通過內(nèi)存地址來訪問,在C語言中,指針變量是用來存放內(nèi)存地址的變量,在不同系統(tǒng)下,指針(內(nèi)存)地址的長度不同,32位CPU下,由于有32根地址線,所以指針(內(nèi)存)地址是由32個bit位組成的,也就是4Byte,在64位CPU下,有64根地址線,所以地址由64個bit位組成,也就是8Byte,指針指向的地址都是一個內(nèi)存單元,一個內(nèi)存單元里面有1byte的數(shù)據(jù)。

創(chuàng)建第一個指針變量:

#include <stdio.h>
int a = 8;			//先創(chuàng)建一個變量,此變量在內(nèi)存中有自己的地址。
int *pa = &a; 		//&符號取出a的地址,交給pa指針,*符號表示pa是指針類型
*pa = 10;			//我們可以通過*pa修改a的值(沒有*的話pa是a的地址,*是解引用的意思,加上之后pa代表的就不是a的地址而是a)
printf("%d",*pa);	//10

二、指針和指針類型

指針是用來存放地址的,那么為什么還分為char* int* short* long*…….?

一般情況下,char**類型的指針是為了存放char類型變量的地址,int類型的指針是為了存放int類型的地址,short類型的指針是為了存放short類型的地址…….但實際上,指針的類型有一下兩大作用:

  • 指針類型決定了指針進行±整數(shù)的時候±的步長(字節(jié))
  • 指針類型決定了對指針進行解引用的時候能訪問幾個字節(jié)

1.指針±整數(shù)

代碼示例:

#include <stdio.h>
int main()
{
    int a = 10;
    char* char_pa = (char*)&a;
    short* short_pa = (short*)&a;
    int* int_pa = (int*)&a;
    printf("%p\n",&a);			//00000071DCEFFC24	%p輸出a的的地址
    printf("%p\n",char_pa);		//00000071DCEFFC24	
    printf("%p\n",char_pa+1);	//00000071DCEFFC25	加了一個字節(jié)
    printf("%p\n",short_pa);	//00000071DCEFFC24
    printf("%p\n",short_pa+1);	//00000071DCEFFC26	加了兩個字節(jié)
    printf("%p\n",int_pa);		//00000071DCEFFC24
    printf("%p\n",int_pa+1);	//00000071DCEFFC28	加了四個字節(jié)
}

? 可以看到在地址+1之前他們的地址都是與*a一樣,進行+1之后,char加了一個字節(jié),short加了兩個字節(jié),int加了三個字節(jié),也就是說,指針類型能決定指針±的時候可以±多少個字節(jié),±的字節(jié)由類型的長度決定。

2.指針解引用

代碼示例

#include <stdio.h>
int main()
{
	int a = 0x11223344;
    char *char_pa = (char*)&a;
    short *short_pa = (short*)&a;
    int *int_pa = &a;
    printf("%d\n",*char_pa);
    printf("%d\n",*short_pa);
    printf("%d\n",*int_pa);
}

輸出結(jié)果

明明我們賦值的都是&a,那為什么會造成三個類型解引用都不一樣呢?,我們可以用下面代碼測試一下,看看內(nèi)存發(fā)生了什么。

int main()
{
	int a = 0x11223344;
    char *char_pa = (char*)&a;
    *char_pa = 0;
}

這是在a沒有改動之前

執(zhí)行*char_pa = 0;

a的一個字節(jié)被置為了0

int main()
{
    int a = 0x11223344;
	short *short_pa = (short*)&a;
    *short_pa = 0;
}

執(zhí)行*short_pa = 0;

a的兩個字節(jié)被置為了0

 int main()
{
    int *int_pa = &a;
    *int_pa = 0;
    return 0; 
}

執(zhí)行*int_pa = 0;

a的四個字節(jié)被置為了0

由此,我們可以得出結(jié)論,指針類型的第二大作用就是,指針類型決定了對指針解引用時,能訪問或修改幾個字節(jié),這由數(shù)據(jù)類型的大小決定

三.野指針

野指針會指向一段實際的內(nèi)存,但是野指針是指指針指向的位置是不可知的(隨機的,不正確的,沒有初始化的,沒有明確限制的),它指向哪里我們不知道,或者說它指向的空間已經(jīng)被我們釋放,那么他就是一個野指針,在程序中,我們必須要避免野指針的出現(xiàn)。

下面是容易出現(xiàn)野指針的場景

1.引起野指針的原因

(1)指針未初始化。

#include <stdio.h>
int main()
{
	int *p;			//指針沒有指向明確的地址,那么將是隨即地址,也就是野指針
    *p = 1;
}

(2)指針越界訪問

#inlcude <stdio.h>
int main()
{
	int arr[10] = {0};
    int *p = arr;
    for(int i=0;i<13;i++)
    {
		*(p++) = 8;			//當(dāng)指針超出arr數(shù)組的范圍時,p就是野指針
    }
}

(3)指針指向的空間被釋放

int main()
{
	int *p = malloc(10 * sizeof(int));
	free(p);
	*p = 10;				//指針p指向的內(nèi)存空間已經(jīng)被釋放,此時的p就是野指針
	return 0;
}

2.如果避免野指針

(1)指針初始化

(2)小心指針越界

(3)指針指向空間釋放即使置NULL

(4)避免返回局部變量的地址

(5)指針使用之前檢查有效性

int main()
{
    int *p = NULL;		//使用之前初始化為NULL
    if(p!=NULL)
    {
		*p = 10;		//使用之前檢查有效性		
    }
    int *pa = malloc(10 * sizeof(int));
    //此處省略n行代碼
	free(p);
    pa ==NULL;			//指針用完之后,及時置空。
}

到此這篇關(guān)于C語言指針類型與野指針引起的原因的文章就介紹到這了,更多相關(guān)C語言指針類型與野指針內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 數(shù)據(jù)結(jié)構(gòu) 數(shù)組順序存儲詳細介紹

    數(shù)據(jù)結(jié)構(gòu) 數(shù)組順序存儲詳細介紹

    這篇文章主要介紹了數(shù)據(jù)結(jié)構(gòu) 數(shù)組順序存儲詳細介紹的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • C語言中的結(jié)構(gòu)體內(nèi)嵌函數(shù)用法

    C語言中的結(jié)構(gòu)體內(nèi)嵌函數(shù)用法

    這篇文章主要介紹了C語言中的結(jié)構(gòu)體內(nèi)嵌函數(shù)用法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • C語言實現(xiàn)鏈隊列

    C語言實現(xiàn)鏈隊列

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)鏈隊列,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • C++ 實現(xiàn)LRU 與 LFU 的緩存算法

    C++ 實現(xiàn)LRU 與 LFU 的緩存算法

    設(shè)計和實現(xiàn)一個LRU 緩存機制。其支持獲取數(shù)據(jù) get 和 寫入數(shù)據(jù) put,設(shè)計并實現(xiàn)最少訪問頻率(LFU)緩存的數(shù)據(jù)結(jié)構(gòu)。LFU的每個數(shù)據(jù)塊都有一個引用計數(shù),所有數(shù)據(jù)塊按照引用計數(shù)排序,具有相同引用計數(shù)的數(shù)據(jù)塊則按照時間進行排序。其支持get 和 put,具體了解請看下文
    2021-09-09
  • 詳解C語言中fseek函數(shù)和ftell函數(shù)的使用方法

    詳解C語言中fseek函數(shù)和ftell函數(shù)的使用方法

    這篇文章主要介紹了C語言中fseek函數(shù)和ftell函數(shù)的使用方法,兩個函數(shù)分別用于設(shè)置和返回文件指針stream的位置,需要的朋友可以參考下
    2016-03-03
  • MFC擴展DLL中導(dǎo)出類和對話框的實現(xiàn)方法

    MFC擴展DLL中導(dǎo)出類和對話框的實現(xiàn)方法

    這篇文章主要介紹了MFC擴展DLL中導(dǎo)出類和對話框的實現(xiàn)方法,詳細講述了實現(xiàn)擴展DLL中導(dǎo)出類和對話框的具體步驟與方法,具有不錯的實用價值,需要的朋友可以參考下
    2014-10-10
  • C語言數(shù)組棧實現(xiàn)模板

    C語言數(shù)組棧實現(xiàn)模板

    這篇文章主要為大家詳細介紹了C語言數(shù)組棧實現(xiàn)模板,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • 一文詳解C++11中decltype的使用

    一文詳解C++11中decltype的使用

    這篇文章主要為大家分享了C++11中decltype關(guān)鍵字的使用示例,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2023-07-07
  • C++中map容器的具體使用

    C++中map容器的具體使用

    本文主要介紹了C++中map容器的具體使用,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • C語言約瑟夫環(huán)的實現(xiàn)

    C語言約瑟夫環(huán)的實現(xiàn)

    這篇文章主要介紹了C語言約瑟夫環(huán)的實現(xiàn)的相關(guān)資料,這里主要是利用數(shù)據(jù)數(shù)據(jù)結(jié)果中循環(huán)鏈表來實現(xiàn),需要的朋友可以參考下
    2017-08-08

最新評論

乌恰县| 客服| 阿尔山市| 大悟县| 永靖县| 平昌县| 江门市| 宝鸡市| 吉安县| 凤冈县| 泉州市| 桃园县| 宁阳县| 大同县| 焦作市| 绥江县| 灌阳县| 什邡市| 通辽市| 余江县| 凤庆县| 阳朔县| 扬州市| 兰考县| 郸城县| 重庆市| 万年县| 油尖旺区| 南汇区| 广昌县| 乐陵市| 垫江县| 宣威市| 蓬安县| 闽清县| 保靖县| 手机| 谢通门县| 丰县| 莒南县| 噶尔县|