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ú)法使用的,讀寫(xiě)該地址會(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)似把野狗栓前來(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)文章
C++11?關(guān)鍵字?const?使用小結(jié)
const大致意思是“我承諾不改變這個(gè)值”。主要用于說(shuō)明接口,這樣在把變量傳入函數(shù)時(shí)就不必?fù)?dān)心變量會(huì)在函數(shù)內(nèi)被改變,本文給大家介紹C++11?關(guān)鍵字?const?使用小結(jié),感興趣的朋友一起看看吧2021-12-12
C語(yǔ)言格式輸出二進(jìn)制的2種方法總結(jié)
眾所周知C中以八進(jìn)制,十進(jìn)制和十六進(jìn)制都可以通過(guò)%o,%d和%x輕松實(shí)現(xiàn),然而唯獨(dú)沒(méi)有提供二進(jìn)制輸出的快速方式,下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言格式輸出二進(jìn)制的2種方法,需要的朋友可以參考下2022-08-08
C++實(shí)現(xiàn)數(shù)據(jù)文件存儲(chǔ)與加載
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)數(shù)據(jù)文件存儲(chǔ)與加載,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-06-06
嵌入式C程序優(yōu)質(zhì)編寫(xiě)全面教程規(guī)范
這是一年前我為公司內(nèi)部寫(xiě)的一個(gè)文檔,旨在向年輕的嵌入式軟件工程師們介紹如何在裸機(jī)環(huán)境下編寫(xiě)優(yōu)質(zhì)嵌入式C程序。感覺(jué)是有一定的參考價(jià)值,所以拿出來(lái)分享,拋磚引玉2022-04-04
linux下c語(yǔ)言中隱藏進(jìn)程命令行參數(shù)(例如輸入密碼等高危操作)
啟動(dòng)程序很多時(shí)候用命令行參數(shù)可以很方便,做到簡(jiǎn)化一些配置,但是輸入用戶名密碼等操作,如果通過(guò)進(jìn)程查看工具直接看到密碼就太不安全了,這里就為大家分享一下方法2021-01-01

