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

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

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

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

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

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

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

一、概念:

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

二、野指針成因:

2.1. 指針未初始化

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

2.2 指針越界訪問

#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的范圍時,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語言中定義的?個標(biāo)識符常量,值是0,0也是地址,這個地址是無法使用的,讀寫該地址會報錯。
        初始化如下:

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

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

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

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;
    }
    //此時p已經(jīng)越界了,可以把p置為NULL
    p = NULL;
    //下次使?的時候,判斷p不為NULL的時候再使?
    p = &arr[0];//重新讓p獲得地址
    if(p != NULL) //判斷
    {
        //...
    }
    return 0;
}

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

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

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

相關(guān)文章

  • C++ typeid 和虛函數(shù)詳解

    C++ typeid 和虛函數(shù)詳解

    這篇文章主要介紹了c++ typeid 和虛函數(shù)的使用,幫助大家更好的理解和使用c++,感興趣的朋友可以了解下,希望能夠給你帶來幫助
    2021-09-09
  • C++11?關(guān)鍵字?const?使用小結(jié)

    C++11?關(guān)鍵字?const?使用小結(jié)

    const大致意思是“我承諾不改變這個值”。主要用于說明接口,這樣在把變量傳入函數(shù)時就不必擔(dān)心變量會在函數(shù)內(nèi)被改變,本文給大家介紹C++11?關(guān)鍵字?const?使用小結(jié),感興趣的朋友一起看看吧
    2021-12-12
  • C語言格式輸出二進制的2種方法總結(jié)

    C語言格式輸出二進制的2種方法總結(jié)

    眾所周知C中以八進制,十進制和十六進制都可以通過%o,%d和%x輕松實現(xiàn),然而唯獨沒有提供二進制輸出的快速方式,下面這篇文章主要給大家介紹了關(guān)于C語言格式輸出二進制的2種方法,需要的朋友可以參考下
    2022-08-08
  • C++實現(xiàn)數(shù)據(jù)文件存儲與加載

    C++實現(xiàn)數(shù)據(jù)文件存儲與加載

    這篇文章主要為大家詳細介紹了C++實現(xiàn)數(shù)據(jù)文件存儲與加載,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-06-06
  • C++編譯器和鏈接器工作原理及使用方法完全指南

    C++編譯器和鏈接器工作原理及使用方法完全指南

    本文將詳細介紹C++中的編譯器和鏈接器以及它們的工作原理及使用方法全面詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-05-05
  • C語言實現(xiàn)哈夫曼樹

    C語言實現(xiàn)哈夫曼樹

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)哈夫曼樹,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • C語言遞歸思想實現(xiàn)漢諾塔詳解

    C語言遞歸思想實現(xiàn)漢諾塔詳解

    大家好,本篇文章主要講的是C語言遞歸思想實現(xiàn)漢諾塔詳解,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-01-01
  • 嵌入式C程序優(yōu)質(zhì)編寫全面教程規(guī)范

    嵌入式C程序優(yōu)質(zhì)編寫全面教程規(guī)范

    這是一年前我為公司內(nèi)部寫的一個文檔,旨在向年輕的嵌入式軟件工程師們介紹如何在裸機環(huán)境下編寫優(yōu)質(zhì)嵌入式C程序。感覺是有一定的參考價值,所以拿出來分享,拋磚引玉
    2022-04-04
  • linux下c語言中隱藏進程命令行參數(shù)(例如輸入密碼等高危操作)

    linux下c語言中隱藏進程命令行參數(shù)(例如輸入密碼等高危操作)

    啟動程序很多時候用命令行參數(shù)可以很方便,做到簡化一些配置,但是輸入用戶名密碼等操作,如果通過進程查看工具直接看到密碼就太不安全了,這里就為大家分享一下方法
    2021-01-01
  • C語言單鏈表貪吃蛇小游戲

    C語言單鏈表貪吃蛇小游戲

    這篇文章主要為大家詳細介紹了C語言單鏈表貪吃蛇小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-02-02

最新評論