C語言規(guī)避野指針的方法流程
野指針就是指針指向的不是一個有效(合法)的地址。
在程序中,如果訪問野指針,可能會造成程序的崩潰。
出現(xiàn)野指針的情況主要有三種:
1)指針在定義的時候,如果沒有進行初始化,它的值是不確定的(亂指一氣)。
2)如果用指針指向了動態(tài)分配的內存,內存被釋放后,指針不會置空,但是,指向的地址已失效。
3)指針指向的變量已超越變量的作用域(變量的內存空間已被系統(tǒng)回收),讓指針指向了函數(shù)的局部變量,或者把函數(shù)的局部變量的地址作為返回值賦給了指針。
規(guī)避方法:
1)指針在定義的時候,如果沒地方指,就初始化為nullptr。
2)動態(tài)分配的內存被釋放后,將其置為nullptr。
3)函數(shù)不要返回局部變量的地址。
注意:野指針的危害比空指針要大很多,在程序中,如果訪問野指針,可能會造成程序的崩潰。是可能,不是一定,程序的表現(xiàn)是不穩(wěn)定,增加了調試程序的難度。
下面看下C語言如何規(guī)避野指針,具體內容如下所示:
一、概念:
野指針就是指針指向的位置是不可知的(隨機的、不正確的、沒有明確限制的)
二、野指針成因:
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++)
{
//當指針指向的范圍超出數(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 指針初始化
如果明確知道指針指向哪里就直接賦值地址,如果不知道指針應該指向哪里,可以給指針賦值NULL.
NULL 是C語言中定義的?個標識符常量,值是0,0也是地址,這個地址是無法使用的,讀寫該地址會報錯。
初始化如下:
#include <stdio.h>
int main()
{
int num = 10;
int*p1 = #
int*p2 = NULL;
return 0;
}3.2 指針變量不再使用時,及時置NULL,指針使用之前檢查有效性
當指針變量指向一塊區(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已經越界了,可以把p置為NULL
p = NULL;
//下次使?的時候,判斷p不為NULL的時候再使?
p = &arr[0];//重新讓p獲得地址
if(p != NULL) //判斷
{
//...
}
return 0;
}3.4 避免返回局部變量的地址
如造成野指針的第3個例子,不要返回局部變量的地址。
到此這篇關于C語言規(guī)避野指針的方法流程的文章就介紹到這了,更多相關C語言規(guī)避野指針內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Qt圖形圖像開發(fā)曲線圖表模塊QChart庫基本用法、各個類之間的關系說明
這篇文章主要介紹了Qt圖形圖像開發(fā)曲線圖表模塊QChart庫基本用法、各個類之間的關系說明,需要的朋友可以參考下2020-03-03
C++實現(xiàn)LeetCode(65.驗證數(shù)字)
這篇文章主要介紹了C++實現(xiàn)LeetCode(65.驗證數(shù)字),本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下2021-07-07
C++連接mysql數(shù)據(jù)庫并讀取數(shù)據(jù)的具體步驟
在實際開發(fā)中我們經常需要對數(shù)據(jù)庫進行訪問,針對不同類型的數(shù)據(jù)庫(如MySQL、sqLite、Access、Excel等),如果采用不同的方法進行連接,會把我們搞崩潰,下面這篇文章主要給大家介紹了關于C++連接mysql數(shù)據(jù)庫并讀取數(shù)據(jù)的具體步驟,需要的朋友可以參考下2023-04-04
Qt實現(xiàn)SqlRelationalTable關聯(lián)表組件
在Qt中我們可以通過拖拽的方式將不同組件放到指定的位置,實現(xiàn)圖形化開發(fā)極大的方便了開發(fā)效率,本章將重點介紹SqlRelationalTable關聯(lián)表組件的常用方法及靈活運用,感興趣的可以了解一下2023-12-12

