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

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

 更新時(shí)間:2023年02月11日 08:54:53   作者:悲傷的豬大腸9  
我們C語言獨(dú)一無二的特色——指針。說起指針,可能很多人都是還沒學(xué)就已經(jīng)聽說過其鼎鼎大名,因?yàn)橛泻芏鄠餮院屯嫘κ裁吹恼f指針很難,其實(shí)大家大可不必有畏難情緒,指針這個(gè)東西雖然確實(shí)有一定難度,但是這是基于其優(yōu)秀的靈活性而衍生的一點(diǎn)小問題

一、指針是什么

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

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

#include <stdio.h>
int a = 8;			//先創(chuàng)建一個(gè)變量,此變量在內(nèi)存中有自己的地址。
int *pa = &a; 		//&符號(hào)取出a的地址,交給pa指針,*符號(hào)表示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í)際上,指針的類型有一下兩大作用:

  • 指針類型決定了指針進(jìn)行±整數(shù)的時(shí)候±的步長(zhǎng)(字節(jié))
  • 指針類型決定了對(duì)指針進(jìn)行解引用的時(shí)候能訪問幾個(gè)字節(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	加了一個(gè)字節(jié)
    printf("%p\n",short_pa);	//00000071DCEFFC24
    printf("%p\n",short_pa+1);	//00000071DCEFFC26	加了兩個(gè)字節(jié)
    printf("%p\n",int_pa);		//00000071DCEFFC24
    printf("%p\n",int_pa+1);	//00000071DCEFFC28	加了四個(gè)字節(jié)
}

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

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,那為什么會(huì)造成三個(gè)類型解引用都不一樣呢?,我們可以用下面代碼測(cè)試一下,看看內(nèi)存發(fā)生了什么。

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

這是在a沒有改動(dòng)之前

執(zhí)行*char_pa = 0;

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

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

執(zhí)行*short_pa = 0;

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

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

執(zhí)行*int_pa = 0;

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

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

三.野指針

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

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

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ù)組的范圍時(shí),p就是野指針
    }
}

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

int main()
{
	int *p = malloc(10 * sizeof(int));
	free(p);
	*p = 10;				//指針p指向的內(nèi)存空間已經(jīng)被釋放,此時(shí)的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;			//指針用完之后,及時(shí)置空。
}

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

相關(guān)文章

  • C++面經(jīng)之什么是RAII面試問題解析

    C++面經(jīng)之什么是RAII面試問題解析

    這篇文章主要介紹了C++面經(jīng)之什么是RAII面試問題解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • Qt?多語言程序設(shè)計(jì)的實(shí)現(xiàn)

    Qt?多語言程序設(shè)計(jì)的實(shí)現(xiàn)

    本文主要介紹了Qt?多語言程序設(shè)計(jì)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • C++實(shí)現(xiàn)簡(jiǎn)單酒店管理系統(tǒng)

    C++實(shí)現(xiàn)簡(jiǎn)單酒店管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)簡(jiǎn)單酒店管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • C++與C#互調(diào)dll的實(shí)現(xiàn)步驟

    C++與C#互調(diào)dll的實(shí)現(xiàn)步驟

    這篇文章主要介紹了C++與C#互調(diào)dll的實(shí)現(xiàn)步驟,dll動(dòng)態(tài)鏈接庫(kù)的共享在一些大型項(xiàng)目中有一定的應(yīng)用價(jià)值,需要的朋友可以參考下
    2014-08-08
  • C++中 STL list詳解及簡(jiǎn)單實(shí)例

    C++中 STL list詳解及簡(jiǎn)單實(shí)例

    這篇文章主要介紹了C++中 STL list詳解及簡(jiǎn)單實(shí)例的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • Qt實(shí)現(xiàn)繪制網(wǎng)格背景的示例代碼

    Qt實(shí)現(xiàn)繪制網(wǎng)格背景的示例代碼

    這篇文章主要介紹了Qt如何實(shí)現(xiàn)繪制網(wǎng)格背景,并且能實(shí)現(xiàn)窗口大小調(diào)整時(shí)網(wǎng)格背景也自動(dòng)調(diào)整重繪,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2022-06-06
  • VS未找到框架“.NETFramework,Version=v4.6.1”引用程序集的解決辦法

    VS未找到框架“.NETFramework,Version=v4.6.1”引用程序集的解決辦法

    本文主要介紹了VS未找到框架“.NETFramework,Version=v4.6.1”引用程序集的解決辦法,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-10-10
  • C++實(shí)現(xiàn)日期類(Date類)的方法

    C++實(shí)現(xiàn)日期類(Date類)的方法

    下面小編就為大家?guī)硪黄狢++實(shí)現(xiàn)日期類(Date類)的方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-01-01
  • C語言深入分析函數(shù)與宏的使用

    C語言深入分析函數(shù)與宏的使用

    C語言函數(shù)是一種函數(shù),用來編譯C語言,一般包括字符庫(kù)函數(shù),數(shù)學(xué)函數(shù),目錄函數(shù),進(jìn)程函數(shù),診斷函數(shù),操作函數(shù)等,宏在C語言中是一段有名稱的代碼片段。無論何時(shí)使用到這個(gè)宏的時(shí)候,宏的內(nèi)容都會(huì)被這段代碼替換掉
    2022-04-04
  • C語言實(shí)題講解快速掌握單鏈表上

    C語言實(shí)題講解快速掌握單鏈表上

    單鏈表是后面要學(xué)的雙鏈表以及循環(huán)鏈表的基礎(chǔ),要想繼續(xù)深入了解數(shù)據(jù)結(jié)構(gòu)以及C語言,我們就要奠定好這塊基石!接下來就和我一起學(xué)習(xí)吧
    2022-04-04

最新評(píng)論