91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

簡述C語言中什么是懸空指針和野指針

GReq_mcu168 ? 來源:嗶哩嗶哩 ? 作者:C語言_編程俱樂部 ? 2021-03-18 11:18 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

1 懸空指針

C語言中的指針可以指向一塊內(nèi)存,如果這塊內(nèi)存稍后被操作系統(tǒng)回收(被釋放),但是指針仍然指向這塊內(nèi)存,那么,此時該指針就是“懸空指針”。下面這段C語言代碼是一個例子,請看:

void *p = malloc(size);assert(p);free(p); // 現(xiàn)在 p 是“懸空指針” C語言中的“懸空指針”會引發(fā)不可預(yù)知的錯誤,而且這種錯誤一旦發(fā)生,很難定位。這是因?yàn)樵?free(p) 之后,p 指針仍然指向之前分配的內(nèi)存,如果這塊內(nèi)存暫時可以被程序訪問并且不會造成沖突,那么之后使用 p 并不會引發(fā)錯誤。

最難調(diào)試的 bug 總是不能輕易復(fù)現(xiàn)的 bug,對不?

所以在實(shí)際的C語言程序開發(fā)中,為了避免出現(xiàn)“懸空指針”引發(fā)不可預(yù)知的錯誤,在釋放內(nèi)存之后,常常會將指針 p 賦值為 NULL:

void *p = malloc(size);assert(p);free(p); // 避免“懸空指針”p = NULL; 這么做的好處是一旦再次使用被釋放的指針 p,就會立刻引發(fā)“段錯誤”,程序員也就能立刻知道應(yīng)該修改C語言代碼了。

2野指針

上面我們講的“懸空指針”是指向被釋放內(nèi)存的指針,“野指針”則是不確定其具體指向的指針?!耙爸羔槨弊畛碜杂谖闯跏蓟闹羔槪缦旅孢@段C語言代碼:

void *p;// 此時 p 是“野指針” 因?yàn)椤耙爸羔槨笨赡苤赶蛉我鈨?nèi)存段,因此它可能會損壞正常的數(shù)據(jù),也有可能引發(fā)其他未知錯誤,所以C語言中的“野指針”危害性甚至比“懸空指針”還要嚴(yán)重。在實(shí)際的C語言程序開發(fā)中,定義指針時,一般都要盡量避免“野指針”的出現(xiàn)(賦初值):

void *p = NULL;void *data = malloc(size);這兩點(diǎn)內(nèi)容,是C語言比較重要的內(nèi)容,希望大家在編碼的時候一定要注意。

編輯:jq

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • C語言
    +關(guān)注

    關(guān)注

    183

    文章

    7644

    瀏覽量

    145574

原文標(biāo)題:C語言中的“懸空指針”和“野指針”是什么意思?

文章出處:【微信號:mcu168,微信公眾號:硬件攻城獅】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    指針與函數(shù)詳解

    。 2、函數(shù)指針函數(shù)指針,本質(zhì)上他是一個指針,并不是一個函數(shù)。在C語言中有些概念是一脈相承的,之前的推文《
    發(fā)表于 01-23 06:02

    C語言重點(diǎn)—指針

    C語言是比較偏底層的語言,為什么他比較偏底層,就是因?yàn)樗暮芏嗖僮鞫际侵苯俞槍?nèi)存操作的。 這篇我們就來講解C語言的一大特點(diǎn),也是難點(diǎn),
    發(fā)表于 01-22 08:23

    函數(shù)指針介紹

    就是一個指針函數(shù)。其返回值是一個 int 類型的指針,是一個地址。 指針函數(shù)也沒什么特別的,和普通函數(shù)對比不過就是其返回了一個指針(即地址值)而已。
    發(fā)表于 01-21 08:11

    指針難學(xué)的4點(diǎn)原因分析

    p時,前面的*號只是告訴編譯器,p是個指針,其它沒什么用處。我個人一直認(rèn)為,當(dāng)初發(fā)明C語言時,定義指針p時不應(yīng)該用*來說明,你可以用@號,用#號,用$號,隨便用什么號來說明p是個
    發(fā)表于 01-16 06:12

    請教一個C語言指針問題,求解答

    C語言指針,多多少少還是有些難度的,容易有些混淆。 請教大家下面的這個表達(dá)式是啥意思呢? short (*p)[size] = (short (*)[size])0x8ff00000; 是否為在0x8ff00000地址處分
    發(fā)表于 01-12 08:14

    C語言指針p、*p、&p、*&p、&*p分別代表什么

    C語言中指針是非常重要的概念。指針是一個變量,其值為另一個變量的地址。使用指針可以直接訪問內(nèi)存中的數(shù)據(jù),這使得
    發(fā)表于 01-07 07:34

    C語言函數(shù)指針的六個高級的應(yīng)用場景

    函數(shù)指針是一種非常強(qiáng)大的編程工具,它可以讓我們以更加靈活的方式編寫程序。在本文中,我們將介紹 6 個函數(shù)指針的高級應(yīng)用場景,并貼出相應(yīng)的代碼案例和解釋。 回調(diào)函數(shù) 回調(diào)函數(shù)是指在某個事件發(fā)生時被
    發(fā)表于 01-04 12:25

    C語言回調(diào)函數(shù)原來這么簡單

    ” 這個概念,它是回調(diào)函數(shù)能夠?qū)崿F(xiàn)的重要基礎(chǔ)。 1、函數(shù)指針學(xué)習(xí)過C語言的伙伴都知道,C語言中的靈魂 —
    發(fā)表于 12-30 06:45

    Typedef在C語言中的應(yīng)用

    Typedef 在C語言中頻繁用以聲明一個已經(jīng)存在的數(shù)據(jù)類型的同義字。也可以用預(yù)處理器做類似的事。例如,思考一下下面的例子: #define dPS struct s * typedef
    發(fā)表于 12-22 13:53

    C語言中可以嵌套匯編語言嗎?

    請問C語言中可以嵌套匯編語言嗎?
    發(fā)表于 12-15 08:14

    指針的基礎(chǔ)

    1. int va; 這是一個整型變量,32位CPU的話,占有32個bite 2. int *va; 這是一個整型指針變量,用于存放一個整型變量的地址 3. int **va; 這是一個整型
    發(fā)表于 12-15 06:06

    函數(shù)指針指針函數(shù)的區(qū)別

    在學(xué)習(xí)arm過程中發(fā)現(xiàn)這“指針函數(shù)”與“函數(shù)指針”容易搞錯,所以今天,我自己想一次把它搞清楚,找了一些資料,和大家的一些總結(jié),整理到此。和大家分享。   首先它們之間的定義:   1、指針函數(shù)是指帶
    發(fā)表于 12-12 06:34

    函數(shù)指針的概念

    函數(shù)指針是指向函數(shù)的指針變量。 通常我們說的指針變量是指向一個整型、字符型或數(shù)組等變量,而函數(shù)指針是指向函數(shù)。 函數(shù)指針可以像一般函數(shù)一樣
    發(fā)表于 12-11 08:10

    如何用函數(shù)指針調(diào)用函數(shù)

    (void) { int(*p)(int, int);//定義一個函數(shù)指針 int a, b, c; p = Max;//把函數(shù)Max賦給指針變量p, 使p指向Max函數(shù) printf(\"
    發(fā)表于 12-11 06:26

    C指針的妙用分享

    1、你知道嗎?指針其實(shí)是個天生的數(shù)學(xué)家!看這個: #include int main() { int arr[] = {10, 20, 30, 40, 50}; int *p = arr
    發(fā)表于 11-17 06:35