【C語言】動態內存的常見錯誤

前言:

在上章節中講解了動態內存的概念和管理的核心函數。

在本章節繼續為大家介紹動態內存的常見錯誤,讓大家更好的理解運用。

補充:使用內存函數需要頭文件<stdlib.h>

對NULL指針的解引用操作

  1. 當使用malloccallocrealloc等函數分配內存時,如果返回值為NULL(表示分配失敗),直接對NULL指針進行解引用會導致程序崩潰。例如:
   int *p = (int*)malloc(10 * sizeof(int));if (p == NULL) 
{// 處理分配失敗的情況
}

?

正確的做法是先檢查返回值是否為NULL,避免直接使用指針。?

?越界訪問

在訪問動態分配的內存時,如果超出分配的范圍,可能會導致程序崩潰或未定義行為。

例如:?

   int *arr = (int*)malloc(5 * sizeof(int));for (int i = 0; i <= 5; i++) 
{arr[i] = i; // 越界訪問
}free(arr);

解決方法是確保訪問的索引在有效范圍內。

?

釋放非動態分配的內存

使用free函數釋放非動態分配的內存(如棧上分配的內存)會導致未定義行為。例如:

   int arr[10];free(arr); // 錯誤:釋放棧上分配的內存

應確保只對動態分配的內存調用free

重復釋放內存(雙重釋放)


如果對同一塊內存多次調用free函數,會導致程序崩潰或未定義行為。例如:

   int *ptr = (int*)malloc(10 * sizeof(int));free(ptr);free(ptr); // 錯誤:雙重釋放

?釋放部分內存

如果嘗試釋放動態分配內存的一部分,會導致未定義行為。例如:

   int *ptr = (int*)malloc(10 * sizeof(int));free(ptr + 2); // 錯誤:釋放部分內存

正確的做法是釋放整個內存塊。

int main()
{int* p = (int*)malloc(40);if (p == NULL){perror("malloc");return 0;}int i = 0;for (i = 0;i < 10;i++){*p = 5;p++;}free(p);p = NULL;return 0;
}

?

?未初始化的指針使用


使用未初始化的指針可能導致程序崩潰或訪問非法內存。例如:

   int *ptr;printf("%d\n", *ptr); // 錯誤:未初始化的指針

指針在使用前應確保已正確初始化。

內存泄漏

如果分配的內存未被釋放,會導致內存泄漏。

例如:

   int *ptr = (int*)malloc(10 * sizeof(int));// 程序結束時未釋放內存
void test()
{int* p = (int*)malloc(100);if (*p = NULL){*p = 20;}
}
int main()
{test();while (1);return 0;
}

?

?

?

野指針的使用


已釋放的指針或指向不存在內存的指針被稱為野指針,使用野指針可能導致程序崩潰。例如:

   int *ptr = (int*)malloc(10 * sizeof(int));free(ptr);printf("%d\n", *ptr); // 錯誤:野指針

?緩沖區溢出


在訪問動態分配的數組時,如果超出數組邊界,可能導致緩沖區溢出。例如:

   int *arr = (int*)malloc(5 * sizeof(int));for (int i = 0; i < 6; i++) {arr[i] = i; // 緩沖區溢出}free(arr);

?未檢查realloc失敗


使用realloc調整內存大小時,如果失敗會返回NULL,但原內存塊可能仍然有效。例如:

    int *ptr = (int*)malloc(10 * sizeof(int));ptr = (int*)realloc(ptr, 20 * sizeof(int));if (ptr == NULL) {// 處理失敗情況}free(ptr);

總結:
C語言中的動態內存管理涉及復雜的操作,容易引發多種錯誤。開發者應嚴格遵循以下原則:

  • 在使用前檢查指針是否為NULL。
  • 確保訪問內存時在有效范圍內。
  • 避免重復釋放內存。
  • 及時釋放不再使用的動態內存。
  • 使用工具(如Valgrind)檢測潛在問題。

?

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

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

相關文章

uniapp-x 二維碼生成

支持X&#xff0c;二維碼生成&#xff0c;支持微信小程序&#xff0c;android&#xff0c;ios&#xff0c;網頁 - DCloud 插件市場 免費的單純用愛發電的

Linux內核之文件驅動隨筆

前言 近期需要實現linux系統文件防護功能&#xff0c;故此調研了些許知識&#xff0c;如何實現文件防護功能從而實現針對文件目錄防護功能。當被保護的目錄&#xff0c;禁止增刪改操作。通過內核層面實現相關功能&#xff0c;另外在通過跟應用層面交互從而實現具體的業務功能。…

利用大模型實現地理領域文檔中英文自動化翻譯

一、 背景描述 在跨國性企業日常經營過程中&#xff0c;經常會遇到專業性較強的文檔翻譯的需求&#xff0c;例如法律文書、商務合同、技術文檔等&#xff1b;以往遇到此類場景&#xff0c;企業內部往往需要指派專人投入數小時甚至數天來整理和翻譯&#xff0c;效率低下&#x…

鴻蒙Flutter倉庫停止更新?

停止更新 熟悉 Flutter 鴻蒙開發的小伙伴應該知道&#xff0c;Flutter 3.7.12 鴻蒙化 SDK 已經在開源鴻蒙社區發布快一年了&#xff0c; Flutter 3.22.x 的鴻蒙化適配一直由鴻蒙突擊隊倉庫提供&#xff0c;最近有小伙伴反饋已經 2 個多月沒有停止更新了&#xff0c;不少人以為停…

(七)深入了解AVFoundation-采集:采集系統架構與 AVCaptureSession 全面梳理

引言 在 iOS 開發中&#xff0c;AVFoundation 是構建音視頻功能的強大底層框架。而在音視頻功能中&#xff0c;“采集”往往是最基礎也是最關鍵的一環。從攝像頭捕捉圖形、到麥克風獲取聲音&#xff0c;構建一條高效且穩定的采集鏈是開發高質量音視頻應用的前提。 本系列將逐…

QML ShaderEffect(著色器效果)組件

ShaderEffect 是 QML 中用于實現自定義著色器效果的組件&#xff0c;允許開發者使用 GLSL 著色器語言創建圖形效果。 核心屬性 基本屬性 屬性類型默認值說明fragmentShaderstring""片段著色器代碼vertexShaderstring""頂點著色器代碼blendingbooltrue是…

基于javaweb的SSM教材征訂與發放管理系統設計與實現(源碼+文檔+部署講解)

技術范圍&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬蟲、數據可視化、小程序、安卓app、大數據、物聯網、機器學習等設計與開發。 主要內容&#xff1a;免費功能設計、開題報告、任務書、中期檢查PPT、系統功能實現、代碼編寫、論文編寫和輔導、論文…

大模型學習筆記------Llama 3模型架構之分組查詢注意力(GQA)

大模型學習筆記------Llama 3模型架構之分組查詢注意力&#xff08;GQA&#xff09; 1、分組查詢注意力&#xff08;GQA&#xff09;的動機2、 多頭注意力&#xff08;Multi-Head Attention, MHA&#xff09;3、 多查詢注意力 (Multi-Query Attention&#xff0c;MQA)4、 分組查…

matlab 環形單層柱狀圖

matlab 環形單層柱狀圖 matlab 環形單層柱狀圖 matlab 環形單層柱狀圖 圖片 圖片 【圖片來源粉絲】 我給他的思路是&#xff1a;直接使用風玫瑰圖可以畫出。 rose_bar 本次我的更新和這個有些不同&#xff01;是環形柱狀圖&#xff0c;可調節細節多&#xff1b; 只需要函數…

Docker--Docker網絡原理

虛擬網卡 虛擬網卡&#xff08;Virtual Network Interface&#xff0c;簡稱vNIC&#xff09; 是一種在軟件層面模擬的網卡設備&#xff0c;不依賴于物理硬件&#xff0c;而是通過操作系統或虛擬化技術實現網絡通信功能。它允許計算機在虛擬環境中模擬物理網卡的行為&#xff0…

linux基礎14--dns和web+dns

DNS&#xff1a;域名系統&#xff08;Domain Name System&#xff09; DNS協議是用來將域名轉換為IP地址或將IP地址轉換為相應的域名 DNS使用TCP和UDP端口53&#xff0c;給用戶提供解析時一般使用UDP53 對于每一級域名長度的限制是63個字符&#xff0c;域名總長度則不能超過2…

C++抽象基類定義與使用

在 C 中&#xff0c;抽象基類&#xff08;Abstract Base Class, ABC&#xff09; 是一種特殊的類&#xff0c;用于定義接口規范和約束派生類的行為。它通過純虛函數&#xff08;Pure Virtual Function&#xff09;強制要求派生類實現特定功能&#xff0c;自身不能被實例化。以下…

用selenium4 webdriver + java 搭建并完成第一個自動化測試腳本

自動化測試任務&#xff1a; 百度搜索自己的姓名。點擊第一個鏈接&#xff08;或者第二個&#xff09;&#xff0c;在新的頁面上&#xff0c;添加斷言&#xff0c;驗證你的名字是否存在。 實驗資料百度網盤下載路徑&#xff1a; 鏈接: https://pan.baidu.com/s/1nVlHX_ivres…

LLM大模型中的基礎數學工具—— 約束優化

Q26: 推導拉格朗日乘子法 的 KKT 條件 拉格朗日乘子法與 KKT 條件是啥&#xff1f; 拉格朗日乘子法是解決約束優化問題的利器。比如&#xff0c;想最小化函數 &#xff0c;同時滿足約束 &#xff0c;就構造拉格朗日函數 &#xff08; 是乘子&#xff09;。KKT 條件是解這類問…

net+MySQL中小民營企業安全生產管理系統(源碼+lw+部署文檔+講解),源碼可白嫖!

摘要 近些年來&#xff0c;隨著科技的飛速發展&#xff0c;互聯網的普及逐漸延伸到各行各業中&#xff0c;給人們生活帶來了十分的便利&#xff0c;中小民營企業安全生產管理系統利用計算機網絡實現信息化管理&#xff0c;使企業的中小民營企業安全生產管理發展和服務水平有顯…

論文閱讀:2024 arxiv AI Safety in Generative AI Large Language Models: A Survey

總目錄 大模型安全相關研究:https://blog.csdn.net/WhiffeYF/article/details/142132328 AI Safety in Generative AI Large Language Models: A Survey 生成式人工智能大型語言模型中的人工智能安全性:一項調查 https://arxiv.org/pdf/2407.18369 https://www.doubao.com…

【MySQL數據庫】表的約束

目錄 1&#xff0c;空屬性 2&#xff0c;默認值 3&#xff0c;列描述 4&#xff0c;zerofill 5&#xff0c;主鍵primary key 6&#xff0c;自增長auto_increment 7&#xff0c;唯一鍵unique 8&#xff0c;外鍵foreign key 在MySQL中&#xff0c;表的約束是指用于插入的…

基于javaweb的SpringBoot校園失物招領系統設計與實現(源碼+文檔+部署講解)

技術范圍&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬蟲、數據可視化、小程序、安卓app、大數據、物聯網、機器學習等設計與開發。 主要內容&#xff1a;免費功能設計、開題報告、任務書、中期檢查PPT、系統功能實現、代碼編寫、論文編寫和輔導、論文…

多模態大語言模型arxiv論文略讀(二十六)

Holistic Autonomous Driving Understanding by Bird’s-Eye-View Injected Multi-Modal Large Models ?? 論文標題&#xff1a;Holistic Autonomous Driving Understanding by Bird’s-Eye-View Injected Multi-Modal Large Models ?? 論文作者&#xff1a;Xinpeng Ding,…

“星睿O6” AI PC開發套件評測 - 部署PVE搭建All in One NAS服務器

Radxa O6平臺上部署PVE搭建All in One NAS服務器 Radxa O6是一款性能卓越的單板計算機&#xff0c;其強勁的硬件配置和多樣化的接口設計&#xff0c;使其成為家庭和小型企業理想的All in One服務器解決方案。值得一提的是&#xff0c;O6原生配備了兩個5G網口&#xff0c;便于直…