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

C語(yǔ)言規(guī)避野指針的方法流程

 更新時(shí)間:2024年03月13日 10:59:58   作者:li-wait  
野指針就是指針指向的不是一個(gè)有效(合法)的地址,在程序中,如果訪問(wèn)野指針,可能會(huì)造成程序的崩潰,這篇文章主要介紹了C語(yǔ)言如何規(guī)避野指針,需要的朋友可以參考下

野指針就是指針指向的不是一個(gè)有效(合法)的地址。
在程序中,如果訪問(wèn)野指針,可能會(huì)造成程序的崩潰。

出現(xiàn)野指針的情況主要有三種:
1)指針在定義的時(shí)候,如果沒(méi)有進(jìn)行初始化,它的值是不確定的(亂指一氣)。
2)如果用指針指向了動(dòng)態(tài)分配的內(nèi)存,內(nèi)存被釋放后,指針不會(huì)置空,但是,指向的地址已失效。
3)指針指向的變量已超越變量的作用域(變量的內(nèi)存空間已被系統(tǒng)回收),讓指針指向了函數(shù)的局部變量,或者把函數(shù)的局部變量的地址作為返回值賦給了指針。

規(guī)避方法:
1)指針在定義的時(shí)候,如果沒(méi)地方指,就初始化為nullptr。
2)動(dòng)態(tài)分配的內(nèi)存被釋放后,將其置為nullptr。
3)函數(shù)不要返回局部變量的地址。
注意:野指針的危害比空指針要大很多,在程序中,如果訪問(wèn)野指針,可能會(huì)造成程序的崩潰。是可能,不是一定,程序的表現(xiàn)是不穩(wěn)定,增加了調(diào)試程序的難度。

下面看下C語(yǔ)言如何規(guī)避野指針,具體內(nèi)容如下所示:

一、概念:

野指針就是指針指向的位置是不可知的(隨機(jī)的、不正確的、沒(méi)有明確限制的)

二、野指針成因:

2.1. 指針未初始化

1. 指針未初始化
#include <stdio.h>
int main()
{
    int *p;//局部變量指針未初始化,默認(rèn)為隨機(jī)值
    *p = 20;
    return 0;
}

2.2 指針越界訪問(wèn)

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

2.3指針指向的空間釋放

#include <stdio.h>
int* test()
{
    int n = 100;
    return &n;
}
int main()
{
    int*p = test();
    printf("%d\n", *p);
    return 0;
}

三、如何規(guī)避野指針

3.1 指針初始化

        如果明確知道指針指向哪里就直接賦值地址,如果不知道指針應(yīng)該指向哪里,可以給指針賦值NULL.
        NULL 是C語(yǔ)言中定義的?個(gè)標(biāo)識(shí)符常量,值是0,0也是地址,這個(gè)地址是無(wú)法使用的,讀寫該地址會(huì)報(bào)錯(cuò)。
        初始化如下:

#include <stdio.h>
int main()
{
    int num = 10;
    int*p1 = #
    int*p2 = NULL;
    return 0;
}

3.2 指針變量不再使用時(shí),及時(shí)置NULL,指針使用之前檢查有效性

        當(dāng)指針變量指向一塊區(qū)域的時(shí)候,我們可以通過(guò)指針訪問(wèn)該區(qū)域,后期不再使這用個(gè)指針訪問(wèn)空間的時(shí)候,我們可以把該指針置為NULL。因?yàn)榧s定俗成的?個(gè)規(guī)則就是:只要是NULL指針就不去訪問(wèn),同時(shí)使用指針之前可以判斷指針是否為NULL。
        我們可以把野指針想象成野狗,野狗放任不管是非常危險(xiǎn)的,所以我們可以找?棵樹(shù)把野狗拴起來(lái),就相對(duì)安全了,給指針變量及時(shí)賦值為NULL,其實(shí)就類似把野狗栓前來(lái),就是把野指針暫時(shí)管理起來(lái)。
       不過(guò)野狗即使拴起來(lái)我們也要繞著走,不能去挑逗野狗,有點(diǎn)危險(xiǎn);對(duì)于指針也是,在使用之前,我們也要判斷是否為NULL,看看是不是被拴起來(lái)起來(lái)的野狗,如果是,不能直接使用;如果不是,我們?cè)偃ナ褂谩?/p>

int main()
{
    int arr[10] = {1,2,3,4,5,6,7,7,8,9,10};
    int *p = &arr[0];
    for(int i=0; i<10; i++)
    {
        *(p++) = i;
    }
    //此時(shí)p已經(jīng)越界了,可以把p置為NULL
    p = NULL;
    //下次使?的時(shí)候,判斷p不為NULL的時(shí)候再使?
    p = &arr[0];//重新讓p獲得地址
    if(p != NULL) //判斷
    {
        //...
    }
    return 0;
}

3.4 避免返回局部變量的地址

如造成野指針的第3個(gè)例子,不要返回局部變量的地址。

到此這篇關(guān)于C語(yǔ)言規(guī)避野指針的方法流程的文章就介紹到這了,更多相關(guān)C語(yǔ)言規(guī)避野指針內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Qt圖形圖像開(kāi)發(fā)曲線圖表模塊QChart庫(kù)基本用法、各個(gè)類之間的關(guān)系說(shuō)明

    Qt圖形圖像開(kāi)發(fā)曲線圖表模塊QChart庫(kù)基本用法、各個(gè)類之間的關(guān)系說(shuō)明

    這篇文章主要介紹了Qt圖形圖像開(kāi)發(fā)曲線圖表模塊QChart庫(kù)基本用法、各個(gè)類之間的關(guān)系說(shuō)明,需要的朋友可以參考下
    2020-03-03
  • 詳解C++17中nodiscard標(biāo)記符的使用

    詳解C++17中nodiscard標(biāo)記符的使用

    在C++?17中引入了一個(gè)標(biāo)記符nodiscard,用于聲明一個(gè)?“非棄值(no-discard)表達(dá)式”。這篇文章就來(lái)和大家來(lái)聊一聊nodiscard標(biāo)記符的使用吧
    2023-02-02
  • C語(yǔ)言版醫(yī)院管理系統(tǒng)

    C語(yǔ)言版醫(yī)院管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言版醫(yī)院管理系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • C++ Clock類模擬實(shí)現(xiàn)鬧鐘運(yùn)行

    C++ Clock類模擬實(shí)現(xiàn)鬧鐘運(yùn)行

    這篇文章主要為大家詳細(xì)介紹了C++ Clock類模擬實(shí)現(xiàn)鬧鐘運(yùn)行,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • C++實(shí)現(xiàn)LeetCode(65.驗(yàn)證數(shù)字)

    C++實(shí)現(xiàn)LeetCode(65.驗(yàn)證數(shù)字)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(65.驗(yàn)證數(shù)字),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • c++中的繼承關(guān)系

    c++中的繼承關(guān)系

    繼承呈現(xiàn)了面向?qū)ο蟪绦蛟O(shè)計(jì)的層次結(jié)構(gòu),體現(xiàn)了由簡(jiǎn)單到復(fù)雜的認(rèn)知過(guò)程,本文給大家介紹c++中的繼承關(guān)系,感興趣的朋友跟隨小編一起看看吧
    2021-07-07
  • C++連接mysql數(shù)據(jù)庫(kù)并讀取數(shù)據(jù)的具體步驟

    C++連接mysql數(shù)據(jù)庫(kù)并讀取數(shù)據(jù)的具體步驟

    在實(shí)際開(kāi)發(fā)中我們經(jīng)常需要對(duì)數(shù)據(jù)庫(kù)進(jìn)行訪問(wèn),針對(duì)不同類型的數(shù)據(jù)庫(kù)(如MySQL、sqLite、Access、Excel等),如果采用不同的方法進(jìn)行連接,會(huì)把我們搞崩潰,下面這篇文章主要給大家介紹了關(guān)于C++連接mysql數(shù)據(jù)庫(kù)并讀取數(shù)據(jù)的具體步驟,需要的朋友可以參考下
    2023-04-04
  • Qt實(shí)現(xiàn)SqlRelationalTable關(guān)聯(lián)表組件

    Qt實(shí)現(xiàn)SqlRelationalTable關(guān)聯(lián)表組件

    在Qt中我們可以通過(guò)拖拽的方式將不同組件放到指定的位置,實(shí)現(xiàn)圖形化開(kāi)發(fā)極大的方便了開(kāi)發(fā)效率,本章將重點(diǎn)介紹SqlRelationalTable關(guān)聯(lián)表組件的常用方法及靈活運(yùn)用,感興趣的可以了解一下
    2023-12-12
  • C語(yǔ)言實(shí)現(xiàn)運(yùn)動(dòng)會(huì)管理系統(tǒng)

    C語(yǔ)言實(shí)現(xiàn)運(yùn)動(dòng)會(huì)管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)運(yùn)動(dòng)會(huì)管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • C語(yǔ)言二叉樹(shù)的非遞歸遍歷實(shí)例分析

    C語(yǔ)言二叉樹(shù)的非遞歸遍歷實(shí)例分析

    這篇文章主要介紹了C語(yǔ)言二叉樹(shù)的非遞歸遍歷,包括了先序遍歷、中序遍歷與后序遍歷,需要的朋友可以參考下
    2014-09-09

最新評(píng)論

息烽县| 呼和浩特市| 延边| 霍林郭勒市| 大荔县| 哈尔滨市| 城步| 屯留县| 上思县| 乌拉特中旗| 纳雍县| 芜湖市| 聂荣县| 湛江市| 响水县| 石城县| 永春县| 雷波县| 台南市| 昌邑市| 双流县| 平原县| 镇雄县| 丰原市| 四川省| 正安县| 新郑市| 醴陵市| 揭阳市| 深圳市| 长武县| 紫云| 云林县| 宜章县| 西昌市| 格尔木市| 泽州县| 韶山市| 乌审旗| 克拉玛依市| 大洼县|