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

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

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

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

簡(jiǎn)述C語(yǔ)言中什么是懸空指針和野指針

GReq_mcu168 ? 來(lái)源:?jiǎn)袅▎袅?/span> ? 作者:C語(yǔ)言_編程俱樂(lè)部 ? 2021-03-18 11:18 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

1 懸空指針

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

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

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

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

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

2野指針

上面我們講的“懸空指針”是指向被釋放內(nèi)存的指針,“野指針”則是不確定其具體指向的指針。“野指針”最常來(lái)自于未初始化的指針,例如下面這段C語(yǔ)言代碼:

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

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

編輯:jq

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

    關(guān)注

    183

    文章

    7644

    瀏覽量

    145544

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

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

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    指針與函數(shù)詳解

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

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

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

    函數(shù)指針介紹

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

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

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

    請(qǐng)教一個(gè)C語(yǔ)言指針問(wèn)題,求解答

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

    C語(yǔ)言指針p、*p、&p、*&p、&*p分別代表什么

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

    C語(yǔ)言函數(shù)指針的六個(gè)高級(jí)的應(yīng)用場(chǎng)景

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

    C語(yǔ)言回調(diào)函數(shù)原來(lái)這么簡(jiǎn)單

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

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

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

    C語(yǔ)言中可以嵌套匯編語(yǔ)言嗎?

    請(qǐng)問(wèn)C語(yǔ)言中可以嵌套匯編語(yǔ)言嗎?
    發(fā)表于 12-15 08:14

    指針的基礎(chǔ)

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

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

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

    函數(shù)指針的概念

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

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

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

    C指針的妙用分享

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