c語言:理解和避免野指針

野指針的定義:

野指針是指一個指針變量存儲了一個無效的地址,通常是一個未初始化的指針或者指向已經被釋放的內存地址。當程序嘗試使用野指針時,可能會導致程序崩潰、內存泄漏或者其他不可預測的行為。因此,在編程中需要特別注意指針的初始化和內存的釋放,以避免出現野指針問題。

我用自己的語言解釋一下:假設你有一個指針變量,它應該指向一個有效的內存地址,比如一個變量或者對象。但是有時候,這個指針可能沒有被正確初始化,或者指向的內存地址已經被釋放了。這樣的指針就被稱為野指針。

舉例說明

1.未初始化的指針:

當一個指針變量未被明確初始化時,它會包含一個隨機的內存地址,這可能會導致它成為野指針。

int *ptr;
*ptr = 5;  // 未初始化的ptr指針成為野指針

正確寫法:初始化指針并分配內存

int *ptr = malloc(sizeof(int));
*ptr = 5;
// 使用ptr
free(ptr); // 在不需要指針指向的內存時釋放內存

2.指針指向已釋放的內存:

當指針指向的內存已經被釋放,但指針仍然保留著這個地址。

int *ptr = malloc(sizeof(int));
free(ptr);
*ptr = 10;  // ptr指向的內存已經被釋放,ptr成為野指針

正確寫法:使用靜態或動態分配的內存,確保指針不指向已釋放的內存

int *ptr = malloc(sizeof(int));
*ptr = 5;
// 使用ptr
free(ptr); // 在不需要指針指向的內存時釋放內存
ptr = NULL; // 將指針設置為NULL,以避免成為野指針

3.指針指向超出作用域的局部變量:

當指針指向一個局部變量,并且在該變量的作用域之外被訪問時,會導致野指針問題。

int *createInt() 
{int num = 10;return #
}int main() 
{int *ptr = createInt();*ptr = 20;  // createInt函數返回的指針指向了已經超出作用域的局部變量num,ptr成為野指針
}

正確寫法:避免指針指向超出作用域的局部變量。

int *createInt() 
{int *num = malloc(sizeof(int));*num = 10;return num;
}int main() 
{int *ptr = createInt();*ptr = 20;// 使用ptrfree(ptr); // 在不需要指針指向的內存時釋放內存
}

?4.指針指向未分配的內存:

當指針指向未分配內存的地址時,會導致野指針問題。

int *ptr = NULL;
*ptr = 5;  // ptr指向未分配的內存,成為野指針

正確寫法:指針指向未分配的內存時需要先分配內存再使用。

int *ptr = malloc(sizeof(int));
*ptr = 5;
// 使用ptr
free(ptr); // 在不需要指針指向的內存時釋放內存

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/211578.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/211578.shtml
英文地址,請注明出處:http://en.pswp.cn/news/211578.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Pandas中DataFrame對象的創建與常用屬性方法(第2講)

Pandas中DataFrame對象的創建與常用屬性方法(第2講) ??????? ??博主 侯小啾 感謝您的支持與信賴。?? ???????????????????????????????????????????????????????????????????????????…

智能優化算法應用:基于孔雀算法無線傳感器網絡(WSN)覆蓋優化 - 附代碼

智能優化算法應用:基于孔雀算法無線傳感器網絡(WSN)覆蓋優化 - 附代碼 文章目錄 智能優化算法應用:基于孔雀算法無線傳感器網絡(WSN)覆蓋優化 - 附代碼1.無線傳感網絡節點模型2.覆蓋數學模型及分析3.孔雀算法4.實驗參數設定5.算法結果6.參考文獻7.MATLAB…

[足式機器人]Part2 Dr. CAN學習筆記-數學基礎Ch0-2 特征值與特征向量

本文僅供學習使用 本文參考: B站:DR_CAN Dr. CAN學習筆記-數學基礎Ch0-2 特征值與特征向量 1. 定義1.1 線性變換1.2 求解特征值,特征向量1.3 應用:對角化矩陣——解耦Decouple 2. Summary 1. 定義 A v ? λ v ? A\vec{v}\lambd…

【網絡奇緣】- 計算機網絡|深入學習物理層|網絡安全

? 🌈個人主頁: Aileen_0v0🔥系列專欄: 一見傾心,再見傾城 --- 計算機網絡~💫個人格言:"沒有羅馬,那就自己創造羅馬~" 回顧鏈接:http://t.csdnimg.cn/ZvPOS 這篇文章是關于深入學習原理參考模型-物理層的相關知識點&…

Linux權限命令詳解

Linux權限命令詳解 文章目錄 Linux權限命令詳解一、什么是權限?二、權限的本質三、Linux中的用戶四、linux中文件的權限4.1 文件訪問者的分類(人)4.2 文件類型和訪問權限(事物屬性) 五、快速掌握修改權限的做法【第一種…

Spark-Streaming+Kafka+mysql實戰示例

文章目錄 前言一、簡介1. Spark-Streaming簡介2. Kafka簡介二、實戰演練1. MySQL數據庫部分2. 導入依賴3. 編寫實體類代碼4. 編寫kafka主題管理代碼5. 編寫kafka生產者代碼6. 編寫Spark-Streaming代碼總結前言 本文將介紹一個使用Spark Streaming和Kafka進行實時數據處理的示例…

實戰1-python爬取安全客新聞

一般步驟:確定網站--搭建關系--發送請求--接受響應--篩選數據--保存本地 1.拿到網站首先要查看我們要爬取的目錄是否被允許 一般網站都會議/robots.txt目錄,告訴你哪些地址可爬,哪些不可爬,以安全客為例子 2. 首先測試在不登錄的…

Docker Network(網絡)——8

目錄: Docker 為什么需要網絡管理Docker 網絡架構簡介 CNMLibnetwork驅動常見網絡類型 bridge 網絡host 網絡container 網絡none 網絡overlay 網絡docker 網絡管理命令 docker network createdocker network inspectdocker network connectdocker network disconne…

class072 最長遞增子序列問題與擴展【算法】

class072 最長遞增子序列問題與擴展【算法】 code1 300. 最長遞增子序列 // 最長遞增子序列和最長不下降子序列 // 給定一個整數數組nums // 找到其中最長嚴格遞增子序列長度、最長不下降子序列長度 // 測試鏈接 : https://leetcode.cn/problems/longest-increasing-subsequen…

830. 單調棧

?????? ??????830. 單調棧 - AcWing題庫 給定一個長度為 N 的整數數列,輸出每個數左邊第一個比它小的數,如果不存在則輸出 ?1?1。 輸入格式 第一行包含整數 N,表示數列長度。 第二行包含 N個整數,表示整數數列…

你知道MySQL中 group by 怎么優化嗎

更好的閱讀體驗,請點擊 YinKai s Blog。 ? 在 MySQL 中 group by 用于按照一個或多個列對結果集進行分組。在討論 group by 怎么優化之前,我們先來看看 group by 的執行流程,這樣我們才能對癥下藥。 group by 執行流程 ? 我們先用下面的 …

Ubuntu 18.04使用Qemu和GDB搭建運行內核的環境

安裝busybox 參考博客: 使用GDBQEMU調試Linux內核環境搭建 一文教你如何使用GDBQemu調試Linux內核 ubuntu22.04搭建qemu環境測試內核 交叉編譯busybox 編譯busybox出現Library m is needed, can’t exclude it (yet)的解釋 S3C2440 制作最新busybox文件系統 https:…

block-recurrent-transformer-pytorch 學習筆記

目錄 有依賴項1: 沒有依賴項,沒有使用例子 沒有依賴項2: 有依賴項1: GitHub - dashstander/block-recurrent-transformer: Pytorch implementation of "Block Recurrent Transformers" (Hutchins & Schlag et a…

gd32和stm32的區別

gd32和stm32的區別 現在的市場上有很多種不同類型的微控制器,其中比較常見的有兩種,即gd32和stm32。兩種微控制器都是中國和歐洲的兩個公司分別推出的,但是它們之間有很多區別,本文將會深入探討這些區別。 1.起源和歷史 gd32是…

2024年網絡安全競賽-Web安全應用

Web安全應用 (一)拓撲圖 任務環境說明: 1.獲取PHP的版本號作為Flag值提交;(例如:5.2.14) 2.獲取MySQL數據庫的版本號作為Flag值提交;(例如:5.0.22) 3.獲取系統的內核版本號作為Flag值提交;(例如:2.6.18) 4.獲取網站后臺管理員admin用戶的密碼作為Flag值提交…

udp多播組播

import socket ,struct,time# 組播地址和端口號 MCAST_GRP 239.0.0.1 MCAST_PORT 8888 # 創建UDP socket對象 sock socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP) # 綁定socket對象到本地端口號 # sock.bind((MCAST_GRP, MCAST_PORT)) …

【4】PyQt輸入框

1. 單行文本輸入框 QLineEdit控件可以輸入單行文本 from PyQt5.QtWidgets import QApplication, QWidget, QLineEdit, QVBoxLayout from PyQt5.QtCore import * from PyQt5.QtGui import QIcon import sysdef init_widget(w: QWidget):# 修改窗口標題w.setWindowTitle(單行輸…

前端面試——CSS面經(持續更新)

1. CSS選擇器及其優先級 !important > 行內樣式 > id選擇器 > 類/偽類/屬性選擇器 > 標簽/偽元素選擇器 > 子/后臺選擇器 > *通配符 2. 重排和重繪是什么?瀏覽器的渲染機制是什么? 重排(回流):當增加或刪除dom節點&…

【面試經典150 | 二叉樹】從中序與后序遍歷序列構造二叉樹

文章目錄 寫在前面Tag題目來源題目解讀解題思路方法一:遞歸 寫在最后 寫在前面 本專欄專注于分析與講解【面試經典150】算法,兩到三天更新一篇文章,歡迎催更…… 專欄內容以分析題目為主,并附帶一些對于本題涉及到的數據結構等內容…