C語言 學習 C程序的內存模型 2025年6月10日08:55:13

堆棧與內存管理

堆棧(Stack) :

后進先出(LIFO) 線性數據結構 包含壓棧(Push) ,彈棧(Pop)

用途:臨時存儲數據(函數調用,局部變量)

管理:由系統自動分配和回收? ?速度快 ,容量有限!

堆棧代碼示例:
//堆棧示例 :局部變量
void getText()
{int text=20;//儲存在堆棧中
}

內存管理:

程序運行時內存的分配,使用和釋放

靜態內存(編譯時分配)

堆棧內存(自動管理):高地址向低地址增長 生命周期與函數調用綁定

堆內存(動態分配)? : 手動管理 ,靈活性高, 易引發內存泄漏或碎片? malloc ,free 等函數實現動態管理? ?低地址向高地址增長?手動控制生命周期 和 釋放 適用于儲存大小不確定或生命周期長的數據

堆內存代碼示例:
//堆內存 示例
void getText()
{
int*text=(int*)malloc(sizeof(int));//手動分配
*text=20;//把指針指向內存地址中的值修改為20
free(text);//手動釋放
text=NULL;//避免野指針}
小拓展(重點必看):
delete[] arr;    // C++釋放數組指針指向的是內存地址
*text=20;// 是把指針指向內存地址 的 值修改為20 地址并沒改變!!!
text=20; //是把指針地址改為20,可能會導致錯誤(20地址可能未分配)詳細說明:
分配后:
text → 0x1000 [未初始化]*text = 20 操作后:
text → 0x1000 [值為20]text = 20 操作后:
text → 0x0014 [非法地址] 程序崩潰特殊例子:
int *arr = malloc(10 * sizeof(int));
for (int i = 0; i < 10; i++) {arr[i] = i * 2;  // 等價于 *(arr+i) = i*2
}防止指針誤操作:
const int* ptr; // 指向的數據不可變  
int* const ptr; // 指針本身不可變  

常見問題

棧溢出:遞歸深度過大,局部變量占用過多空間? ? ? ?解決辦法:優化遞歸用堆內存? ? ? ? ? ? ? ? ? ? ? 內存泄漏: 未釋放堆內存,需確保 malloc 與 free 配對使用 或用(智能指針)C++? ? ? ? ? ? ? ? ? ? ? ? ? 堆內存?野指針: 釋放后 未正確把指針設置為NULL?

普通指針野指針:指針初始化時應明確指向有效內存或設為nullptr。在指針指向的對象被銷毀后(如局部變量離開作用域),應避免繼續使用該指針。避免返回局部變量的指針

C語言內存泄漏的檢測與處理

危害:程序崩潰,性能下降

檢測方法:

1.靜態檢測方法

使用工具分析代碼 :Cppcheck、Clang Static Analyzer、Coverity

舉例使用靜態工具:
//控制臺輸入 使用 cppcheck 工具分析
cppcheck --enable=all ./your_code.c  

2.動態檢測方法

使用工具分析運行:Valgrind(Linux/macOS),AddressSanitizer(ASan)(GCC/Clang)

舉例使用動態工具:
// 使用valgrind 輸出泄漏內存的調用棧
valgrind --leak-check=full ./your_program  
//使用AddressSanitizer 輸出泄漏位置和代碼行
gcc -fsanitize=address -g your_code.c -o output  
./output  

3.自定義檢測封裝函數(調試時使用!)

#include <stdio.h>
#include <stdlib.h>
#define MALLOC(size) _malloc_debug(size, __FILE__, __LINE__) void* _malloc_debug(size_t size, const char* file, int line) {  void* p = malloc(size);  //調用malloc進行內存分配,分配結果保存在指針 p 中printf("output %zu bytes at %s:%d\n", size, file, line);  return p;  
}  
//這是一個指針函數的宏定義
//傳遞的參數為(請求分配的內存字節數,調用的源文件名,調用的源代碼行號)
//使用方法:將所有使用 malloc 的地方替換為 MALLOC 宏:
//舉例:int* arr = (int*)MALLOC(10 * sizeof(int));

處理方法:

構建統一清理函數,在可能發生異常的代碼段前提前清理

void cleanup(int* a, FILE* f) {if (a) free(a);//清理堆內存if (f) fclose(f);//關閉文件
}void risky_operation() {int* data = malloc(100);FILE* file = fopen("test.txt", "r");if (file == NULL) {//如果文件打開失敗 或者不存在 執行以下清除處理cleanup(data, NULL); //調用函數return; //返回函數調用時位置}cleanup(data, file); //不管前面是否被處理這里強制清理
}

總結:

確保每次malloc/calloc后均有對應的free,復雜邏輯可通過注釋標記釋放位置。

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

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

相關文章

CppCon 2015 學習:Implementing class properties effectively

這段內容講的是C中“屬性”&#xff08;Property&#xff09;的實現及其設計理念&#xff0c;并結合一個實際類Text來說明。中文理解如下&#xff1a; 關于“屬性”&#xff08;Property&#xff09; 屬性&#xff1a;介于類的字段&#xff08;field&#xff09;和方法&#…

[electron]預腳本不顯示內聯script

script-src self 是 Content Security Policy (CSP) 中的一個指令&#xff0c;它的作用是限制加載和執行 JavaScript 腳本的來源。 具體來說&#xff1a; self 表示 當前源。也就是說&#xff0c;只有來自當前網站或者當前頁面所在域名的 JavaScript 腳本才被允許執行。"…

基于安卓的文件管理器程序開發研究源碼數據庫文檔

摘 要 伴隨著現代科技的發展潮流&#xff0c;移動互聯網技術快速發展&#xff0c;各種基于通信技術的移動終端設備做的也越來越好了&#xff0c;現代智能手機大量的進入到了我們的生活中。電子產品的各種軟硬技術技術的發展&#xff0c;操作系統的不斷更新換代&#xff0c;谷歌…

MySQL主從復制實現指南

MySQL主從復制實現指南 一、主從復制原理 #mermaid-svg-i1zOswdD4OORQ35t {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-i1zOswdD4OORQ35t .error-icon{fill:#552222;}#mermaid-svg-i1zOswdD4OORQ35t .error-text…

spring jms使用

文章目錄 一、背景介紹二、注意點說明三、代碼pom.xmlmq.propertiesActiveMqConfigJmsSenderActiveMqInfoActivemqProtocolEnum生產者消費者 一、背景介紹 <dependency> 標簽中列出的 spring-jms 是 Spring Framework 提供的一個模塊&#xff0c;用于簡化 Java Message …

筆記——學習HTTP協議

HTTP協議 文章目錄 HTTP協議一、統一資源定位符&#xff08;url&#xff09;&#xff1a;URL編碼格式&#xff1a; 二、HTTP報文結構&#xff1a;三、HTTP請求方法&#xff1a;四、HTTP常見請求頭&#xff1a;五、HTTP狀態碼&#xff1a;六、HTTP常見響應頭&#xff1a;七、HTT…

Unity中的Mathf.Clamp01

2025年6月8日&#xff0c;周日晚上 Mathf.Clamp01 是 Unity 中的一個數學函數&#xff0c;它的作用是將一個浮點數&#xff08;float&#xff09;限制在0 到 1的范圍內。具體來說&#xff1a; 如果輸入值 小于 0&#xff0c;則返回 0。 如果輸入值 大于 1&#xff0c;則返回 1…

1 Studying《Linux Media Documentation》

目錄 1 MEDIA SUBSYSTEM ADMIN AND USER GUIDE 1.1.2 Building support for a media device 1.1.3 Infrared remote control support in video4linux drivers 1.1.4 Digital TV 1.1.5 Cards List 1.1.5.2 PCI drivers 1.1.6 Video4Linux (V4L) driver-specifific docume…

編譯原理 學習 2025年6月10日11:17:54

編譯原理 將高級編程語言編寫的源代碼轉換成機器可執行的代碼(二進制或匯編代碼) 核心任務: 詞法分析(正則表達式和有限自動機): 示例Token分類&#xff1a;關鍵字&#xff1a;if, while 運算符&#xff1a;, 標識符&#xff1a;變量名 分解源代碼為單詞 識別 其中關鍵字 …

風中低語:Linux 信號處理的藝術與實踐

文章目錄 &#x1f307;前言&#x1f3d9;?正文1、信號的處理時機1.1、處理情況1.2、“合適” 的時機 2、用戶態與內核態2.1、概念2.2、重談進程地址空間2.3、信號的處理過程 3、信號的捕捉3.1、內核如何實現信號的捕捉&#xff1f;3.2、sigaction 4、信號部分小結 補充 5、可…

ASP.NET Core SignalR - 部分客戶端消息發送

文章目錄 前言一、消息發送的核心概念1.客戶端標識2.消息接收范圍 二、向特定用戶發送消息管理員向指定用戶發送私信&#xff0c;或用戶之間一對一聊天。 三、向組發送消息聊天室、工作群組、通知訂閱等。 四、廣播消息系統公告、實時統計數據更新等。 五、向角色發送消息向管理…

前后端交互過程中—各類文件/圖片的上傳、下載、顯示轉換

前后端交互過程中—各類文件/圖片的上傳、下載、顯示轉換 圖片上傳下載常用函數&#xff1a;new Blob()**blobParts&#xff1a;&#xff08;必傳&#xff09;****options&#xff1a;&#xff08;可選&#xff09;**blob的常見的MIME類型&#xff1a; URL.createObjectURL()替…

校園二手交易平臺(微信小程序版)

文章目錄 1. 項目概述2. 項目功能思維導圖3. 技術架構1. 前端技術棧2. 后端技術棧 4. 核心模塊實現5. 總結6. 項目實現效果截圖7. 關于作者其它項目視頻教程介紹 1. 項目概述 校園二手交易平臺微信小程序旨在為在校學生提供一個便捷的二手物品交易渠道&#xff0c;包含用戶模塊…

Linux簡單的操作

ls ls 查看當前目錄 ll 查看詳細內容 ls -a 查看所有的內容 ls --help 查看方法文檔 pwd pwd 查看當前路徑 cd cd 轉路徑 cd .. 轉上一級路徑 cd 名 轉換路徑 …

【芯片設計- RTL 數字邏輯設計入門 4.2 -- 組合邏輯賦值 + 時序邏輯狀態保持】

文章目錄 Overview原語句分析變量含義假設(根據命名推測)狀態更新邏輯詳解狀態轉移邏輯舉個實際例子小結Overview 本文將詳細介紹 verilog rtl 中 assign reg_halt_mode_nx = halt_taken | (reg_halt_mode & ~halt_return);的作用,以及這里為何要使用 reg_halt_mode,…

【單片機期末】匯編試卷

一、選擇題 DPTR是16位的&#xff0c;所以尋址范圍是64KB R1是8位的&#xff0c;只能尋址256 訪問內部ROM只能用MOVC指令 一個指令周期是時鐘周期的1/12 12個時鐘周期是一個機器周期 單指令周期是指一個機器周期 T 1 / f 12MHz ~ 1us 13位計數16位計數8位自動重裝載雙8位計數器…

校驗枚舉類類型的入參合法性的統一方案

文章目錄 背景解決實踐定義枚舉類 InEnum注解定義驗證邏輯 InEnumValidator 實際使用 背景 業務要做電商平臺做入參, 在電商平臺被抽離成枚舉類的情況下 &#xff0c;要怎么驗證輸入的參數是正確的呢? 解決 Constraint 實現自定義驗證邏輯 Constraint 注解用于標注其他注解&am…

Unity-NavMesh詳解-其一

今天我們來詳細地探究一下Unity的NavMesh這一性能強大的組件&#xff1a; NavMesh基本使用 NavMesh簡單地說本質上是一個自動尋路的AI組件&#xff0c;我們首先來學習基本的使用。 畫面中我已經添加好了地面&#xff0c;目標&#xff0c;障礙物以及玩家四個要素。 注意我們要…

vue的created和mounted區別

在Vue.js中&#xff0c;created和mounted的核心區別在于調用時機和DOM可訪問性?&#xff1a;created鉤子在組件實例創建后、DOM掛載前調用&#xff0c;適用于數據初始化&#xff1b;mounted鉤子在DOM掛載后調用&#xff0c;支持DOM操作。?? ?調用時機與核心能力對比? ?…

MySQL 8.0 OCP 英文題庫解析(十四)

Oracle 為慶祝 MySQL 30 周年&#xff0c;截止到 2025.07.31 之前。所有人均可以免費考取原價245美元的MySQL OCP 認證。 從今天開始&#xff0c;將英文題庫免費公布出來&#xff0c;并進行解析&#xff0c;幫助大家在一個月之內輕松通過OCP認證。 本期公布試題121~130 試題1…