「懸空指針」和「野指針」究竟是什麼意思?

2021-01-07 酷扯兒

本文轉載自【微信公眾號:strongerHuang,ID:strongerHuang】經微信公眾號授權轉載,如需轉載與原文作者聯繫

提起C語言大部分開發者很自然就會想到指針二字,沒錯,作為C的核心和靈魂,它的地位咱們就不再贅述了,現在我們想跟大家講的是指針中的兩個特有名詞:「懸空指針」和「野指針」。

一、懸空指針

C語言中的指針可以指向一塊內存,如果這塊內存稍後被作業系統回收(被釋放),但是指針仍然指向這塊內存,那麼,此時該指針就是「懸空指針」。下面這段C語言代碼是一個例子,請看:

void *p = malloc(size);

assert(p);

free(p);

// 現在 p 是「懸空指針」

C語言中的「懸空指針」會引發不可預知的錯誤,而且這種錯誤一旦發生,很難定位。這是因為在 free(p) 之後,p 指針仍然指向之前分配的內存,如果這塊內存暫時可以被程序訪問並且不會造成衝突,那麼之後使用 p 並不會引發錯誤。

最難調試的 bug 總是不能輕易復現的 bug,對不?

所以在實際的C語言程序開發中,為了避免出現「懸空指針」引發不可預知的錯誤,在釋放內存之後,常常會將指針 p 賦值為 NULL:

void *p = malloc(size);

assert(p);

free(p);

// 避免「懸空指針」

p = NULL;

這麼做的好處是一旦再次使用被釋放的指針 p,就會立刻引發「段錯誤」,程式設計師也就能立刻知道應該修改C語言代碼了。

二、野指針

上面我們講的「懸空指針」是指向被釋放內存的指針,「野指針」則是不確定其具體指向的指針。「野指針」最常來自於未初始化的指針,例如下面這段C語言代碼:

void *p;

// 此時 p 是「野指針」

因為「野指針」可能指向任意內存段,因此它可能會損壞正常的數據,也有可能引發其他未知錯誤,所以C語言中的「野指針」危害性甚至比「懸空指針」還要嚴重。在實際的C語言程序開發中,定義指針時,一般都要儘量避免「野指針」的出現(賦初值):

void *p = NULL;

void *data = malloc(size);

這兩點內容,是C語言比較重要的內容,希望大家在編碼的時候一定要注意。

免責聲明:本文來源網絡,版權歸原作者所有。如涉及作品版權問題,請與我聯繫刪除。

相關焦點

  • C語言,局部變量的指針,棧幀
    C/C++不能返回局部變量的指針,是一條重要的語法規則。至於為什麼,則不是那麼顯眼。局部變量,是分配在棧上的變量,隨著函數調用的返回而失效。函數調用結束之後,局部變量的指針,也就是野指針了,不能在函數外繼續使用。
  • 指針萬用表和數字萬用表哪個好用(指針萬用表和數字萬用表正確選用)
    萬用表有很多種,現在最流行的有機械指針式的和數字式的萬用表。它們各有其優缺點,到底指針萬用表和數字萬用表哪個好用呢? 指針萬用表和數字萬用表哪個好用 1、顯示方式各有所長:很多人一看到數字萬用表的時候,第一反應是什麼?肯定會覺得,哇,這個萬用表多好啊,量了可以直接用數字顯示出來,都不用我去讀數了,多方便!
  • C語言中的「不透明」指針是什麼,它有什麼用呢?
    要是有的話,什麼樣的指針才是不透明指針呢,有什麼用呢?C語言的「不透明指針」有什麼用?從字面意思來看,「不透明」意味著看不到內部,因此「不透明指針」即看不到內部定義的指針。」其實並不是什麼新概念,它不過是為了便於描述特定類型指針,方便同行之間交流取的名字而已。
  • 如何查看指針水錶
    指針水錶查看則比數字水錶稍微複雜一點。一般的指針水錶都會有8個手錶狀的指針。一般黑色的指針表示的就是個十百千噸,而紅色的指針則表示小數位。下面小編來教大家怎麼看。就拿百位數的指針為例。如果指針在3和4之間,那麼就應該算3。所以當水錶的指針在兩個數字之間的時候,就應該算小的那個數。
  • C語言的指針,簡介
    所以在java的JNI庫裡,如果需要把native層的C結構體的指針保存到java層,一般是定義一個long類型的變量。指針指向的變量,可以是普通變量、數組變量、結構體變量,以及數組元素、結構體的成員變量,還可以是指針變量。指針還可以指向函數,叫做函數指針。
  • 成員函數指針的一些奇怪行為
    如果你只是使用單繼承,則指向成員函數的指針實際上是指向了這個函數的起始地址,因為在單繼承中,所有基類都共享了同一個this指針。我們看看下面的代碼:因為它們都使用了同一個this指針,一個指向基類成員函數的指針可以被當作是指向Derived2的成員函數指針來使用,不需要進行任何的轉換操作。
  • void *指針的妙用
    有我們在C語言中使用的那種數據嵌套指針的方式。也有在linux中將鍊表作為一個單獨的對象,然後將這個對象嵌入到不同的對象中,然後根據container_of()得到對應的對象指針。這些方式都是常用的方式之一。在看uC/OS-II中我閱讀源碼時發現其中竟然很少有關於鍊表的操作。開始也沒有仔細的去分析原因,我甚至認為位圖的方式取代了鍊表。
  • C語言陷阱與技巧31節,都說void*指針是「萬能指針」,它萬能在哪
    利用這一點,程式設計師可以使用 void * 將不公開的數據隱藏起來,避免外界調用者訪問和修改它。事實上,我們完全可以將 p 轉換為 void * 指針:void *p = init();handle(p);這樣一來,只有 init() 庫的開發者才能訪問 p 指向的內容,避免外界調用者「意外」或者「惡意」的修改,整個C語言程序就會穩定和安全很多了。
  • 手錶的夜光指針材質是什麼?有輻射嗎?
    這款上海牌全自動機械夜光金鑽表6008,這款手錶採用了經典三大針設計,指針類型屬於棒型針,棒型指針棒形指針是用這種指針的形狀來命名的。英語中的指示針(index watch hand)也應該算到是棒形針裡。這種指針很直接,也很簡潔。上海牌全自動機械夜光金鑽表6008,在12點位置更加鑲嵌了3顆真鑽,排列成條形,條形的時間刻度,搭配用棒形指針很好地和條形刻度配合,高度統一,簡潔大方。
  • 正確認識數字萬用表與指針萬用表
    數字式萬用表對於測試脈衝數據,或者需要極短時間測試,指針式好點。數字式反應太慢。指針萬用表的好處就是它的指針擺動,能夠非常直觀的提現被測量物的屬性變化。在使用指針式萬用表必須正確區分紅黑表筆。比如用指針式萬用表測量直流電壓:將紅表筆插在「十」插孔,將黑表筆插在「COM一」插孔。這時應注意,因黑表筆對應指針萬用表內部電池正極,而紅表筆對應表內電池負極。所以指針式萬用表的紅表筆帶正電,黑表筆帶負電,這一點跟數字式萬用表有點區別。
  • 指針式萬用表測量電容
    作為電子入門者,正確使用萬用表是最基本的技能,本文主要講解如何用指針式萬用表測量交流電容。
  • C語言編程:以實例教你學指向函數的指針
    指針是C語言的精髓,對於初學者來講,指針是C語言語法學習中比較難的知識點,而這裡面指向函數的指針更是不太容易理解。下面給大家講下怎樣學習理解C語言中指向函數的指針及編程方法和使用例子。注意:這是一篇關於C語言編程的基礎語法內容,C語言大神請繞過。
  • 解析指針式萬用表的原理及應用
    萬用表有很多種,現在最流行的有機械指針式的和數字式的萬用表,它們各有優點。對於電子初學者,建議使用指針式萬用表,因為它對我們熟悉一些電子知識原理很有幫助。下面我們介紹一些機械指針式萬用表的原理和使用方法。
  • 指針式萬用表型號
    打開APP 指針式萬用表型號 發表於 2018-01-19 17:48:39
  • 青少年信息學競賽Pascal語言:指針(十)
    合肥奧數網訊:合肥市青少年信息學競賽Pascal語言:指針   指針   指針是通過地址來訪問變量的一種特殊的數據類型,屬於動態的數據結構,它可以在需要時產生,用完後則又可以取消或回收,以減少佔用的內存空間。指針變量與其他類型的變量不同,它佔有的不是數據,而是地址。
  • 指針式絕緣電阻表的結構與工作原理
    (2)絕緣電阻表工作原理 絕緣電阻表的測量電路2所示,虛線框內為表內部電路,交流發電機發出的交流電壓經二極體VD1、VD2和電容器C1、C2整流、濾波後成為直流電壓,加在被測電阻Rx上。表外部有3個接線端子,L端子叫線路端子;E端子叫接地端子;G端子叫屏蔽端子(又叫保護環),其內部直接與發電機負極相連。在測量電纜絕緣電阻時要使用G端子。
  • 電工知識:指針式萬用表檔位介紹,測量方法實物圖解,實物演示
    大家好我是小豆,有很多朋友留言想看指針式萬用表,小豆今天就與大家分享指針式萬用表使用方法,首先我們看指針萬用表外部都有信息。指針式萬用表外部插孔代表什麼意思:三極體測量插孔,電壓電阻插孔,公共端,電阻檔調零,檔位選擇,2500V專用插孔,直流10A插孔。
  • 怎樣用指針式萬用表測直流電壓
    >電阻和音頻電平等,它的基本工作原理是利用一隻靈敏的磁電式直流電流表(微安表)做表頭。下面我們來看看怎樣用指針式萬用表測直流電壓。本文引用地址:http://www.eepw.com.cn/article/201807/383781.htm用指針式萬用表測直流電壓的實例就是檢測乾電池電壓,其操作方法如圖所示。
  • C語言|文件指針、fopen()、fscanf()、fclose()
    這是一個簡單的文件系統fscanf()函數的功能是把磁碟文件數據讀出保存到變量(內存)每一個文件都有自己的FILE結構和文件緩衝區exit(0)是系統標準函數,作用是關閉所有打開的文件,並終止程序的執行。
  • 第四篇:C語言中指針與字符串核心知識點梳理
    它又有什麼意義?這就涉及到本文要講到的第一個核心概念:指針。重點包括:指針處理一維數組、動態內存分配等。C語言的基本數據類型中有一個char的關鍵詞,可以存儲單個的字符。那麼,像漢字以及由多個字符組成的內容,又該如何存儲呢?