C/C++內存陷阱:為何返回局部變量地址是“定時炸彈”?

資料合集下載鏈接:

?https://pan.quark.cn/s/472bbdfcd014?

在編程世界里,有些錯誤就像是隱藏在代碼里的“定時炸彈”,平時可能相安無事,但在某個不經意的時刻就會引爆,導致程序崩潰或出現無法解釋的詭異行為。今天,我們要拆解的,就是這樣一個極具迷惑性又極其危險的炸彈——從函數中返回一個局部變量的地址

這篇博客將帶你深入理解為什么這個操作是絕對禁止的,以及它會如何“污染”你的程序。

問題的根源:棧(Stack)內存的“閱后即焚”特性

在深入案例之前,我們必須快速回顧一下**棧區(Stack)**的特性。

當一個函數被調用時,系統會在棧上為它開辟一塊專屬的內存空間,我們稱之為“棧幀”(Stack Frame)。這塊空間用來存放函數的所有局部變量、函數參數等。

棧最重要的一個特點就是自動管理生命周期短暫

  • 函數調用時:棧幀被創建,局部變量誕生。
  • 函數返回時:棧幀被銷毀,其中所有的局部變量都會被立即釋放。

這就像一塊“閱后即焚”的黑板。函數在上面寫寫畫畫,一旦函數結束,這塊黑板就會被立刻擦得干干凈凈,以便下一個函數使用。

如果你試圖返回一個局部變量的地址,就相當于在黑板擦干凈后,還想根據一個舊的地址去找上面寫過的內容。這顯然是行不通的,而且非常危險。

現在,讓我們通過兩個案例,看看危險是如何發生的。


案例一:返回一個局部整型變量的地址

我們先從一個最簡單的例子開始。我們創建一個函數 ??create

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

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

相關文章

編程與數學 03-001 計算機組成原理 21_服務器計算機組成實例解析

編程與數學 03-001 計算機組成原理 21_服務器計算機組成實例解析一、引言二、硬件架構特點(一)多核/多處理器設計(二)大容量高帶寬內存(三)存儲系統(四)高可用性設計三、性能優化技術…

opencv簡介(附電子書資料)

概述 OpenCV(Open Source Computer Vision Library)是一個開源的計算機視覺和機器學習軟件庫,廣泛應用于圖像處理、目標檢測、模式識別等領域,是計算機視覺領域最常用的工具之一。電子書學習資料:https://pan.quark.cn…

納米編輯器之Nano 編輯器退出**的詳細操作指南

以下是關于 Nano 編輯器退出的詳細操作指南,涵蓋多種常見場景及技巧: 基礎退出與保存操作 ?保存修改并退出(最常用)快捷鍵觸發退出:按下 Ctrl X[1][2][4]。確認保存:若需保存改動,按 Y&#x…

<HMI><威綸通><觸摸屏>基于威綸通MT8106iQ觸摸屏,實現自定義登錄窗口(優化)

前言 本系列是關于PLC相關的博文,包括PLC編程、PLC與上位機通訊、PLC與下位驅動、儀器儀表等通訊、PLC指令解析等相關內容。 PLC品牌包括但不限于西門子、三菱等國外品牌,匯川、信捷等國內品牌。 除了PLC為主要內容外,PLC相關元器件如觸摸屏(HMI)、交換機等工控產品,如…

visual studio 性能調試

調試 -> 性能查看器 -> CPU使用率 -> 開始 -> 外部代碼 -> 調用樹。如果外部代碼中沒有啥東西,則先清理,再生成一遍。在 Visual Studio 中獲取類似截圖中詳細的函數級耗時分析(尤其針對 DLL 中的函數),…

Java JVM

前言 JVM是Java的重要組成部分,對于我這個Cpper轉Javaer也需要認真學習才對。 一、JVM內存結構 #mermaid-svg-rYtbHArIPV8iAK9I {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-rYtbHArIPV8iAK9I .erro…

便捷刪除Android開發中XML中重復字符串資源的一個辦法

從android系統源碼中移植一些app到android studio開發的時候可能會遇到字符串重復的編譯報錯。一個辦法是把重復的刪除,只剩余一條即可。例如下面的編譯錯誤:Found item String/abc more than one time但是呢,xml中一般這種重復的很多很多&am…

免模型控制

文章目錄免模型控制Q-Learning 算法原理Sarsa 算法區別:免模型控制 免模型控制要解決的問題是,如何選擇動作以達到最高得分 Q-Learning 算法 原理 首先Q-Learning 確定了一個前提最優策略:π(s)arg?max?aQ(s,a)\pi(s) \arg\max_a Q(s,…

Vmware VSAN主機停機維護流程

當VSAN主機由于故障或進行擴容操作需要停機維護時,在關閉ESXi主機前和啟動ESXi主機后需要進行一些必要的檢查操作,以免對vSAN集群環境造成不可預知的風險,影響集群中的虛擬機運行。以下是vSAN集群中的ESXi主機停機維護的主要步驟。 1.確認受影…

中小企業安全落地:低成本漏洞管理與攻擊防御方案

中小企業普遍面臨 “預算有限、技術人員不足” 的困境,安全建設常陷入 “想做但做不起” 的尷尬。事實上,中小企業無需追求 “高大上” 的安全方案,通過 “開源工具 簡化流程 聚焦核心” 的思路,即可用低成本實現有效的漏洞管理…

面試150 搜索二維矩陣

思路1 直接遍歷搜尋,逐個判斷即可 class Solution:def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:mlen(matrix)nlen(matrix[0])for i in range(m):for j in range(n):if matrix[i][j]target:return Truereturn False思路2 Z字形搜索從矩…

npm init vite-app runoob-vue3-test2 ,npm init vue@latest,指令區別

這兩個命令都是用于創建 Vue.js 項目的腳手架命令,但它們在技術棧、配置方式和項目結構上有顯著區別:1. npm init vite-app runoob-vue3-test2技術棧:基于 Vite 構建工具使用 Vue 3 作為默認框架由 Vite 團隊維護特點:bash復制代碼…

WPF MVVM進階系列教程(二、數據驗證)

五一出去浪吹風著涼了,今天有點發燒😷 手頭的工作放一放,更新一下博客吧。 什么是數據驗證(Validation) 數據驗證是指用于捕獲非法數值并拒絕這些非法數值的邏輯。 大多數采用用戶輸入的應用都需要有驗證邏輯,以確保用戶已輸入…

AI 音頻產品開發模板及流程(二)

AI 音頻產品開發模板及流程(一) 6. 同聲傳譯 實時翻譯,發言與翻譯幾乎同步,極大提升溝通效率。支持多語言互譯,適用于國際會議、商務洽談等多場景。自動斷句、轉寫和翻譯,減少人工干預,提升準…

kafka4.0集群部署

kafka4.0是最新版kafka,可在kafka官網下載,依賴的jdk版本要求在jdk17及jdk17以上tar -xzf kafka_2.13-4.0.0.tgzmv kafka_2.13-4.0.0 kafkacd kafka# 隨便一臺節點運行生成隨機uuid,后面每臺節點都要使用此uuidbin/kafka-storage.sh random-u…

【News】同為科技亮相首屆氣象經濟博覽會

7月18日,由中國氣象服務協會主辦的國內首個以“氣象經濟”為核心的國家級博覽會——首屆氣象經濟博覽會(以下簡稱“博覽會”)在合肥濱湖國際會展中心開幕。北京同為科技有限公司(TOWE)作為雷電防護領域的技術領導企業&…

數據結構 堆(2)---堆的實現

上篇文章我們詳細介紹了堆和樹的基本概念以及它們之間的關系,還要知道一般實現堆的方式是使用順序結構的數組進行存儲數據及實現。下來我們看看利用順序結構的數組如何實現對的內容:1.堆的實現關于堆的實現,也是三個文件,頭文件,實…

Arraylist與LinkedList區別

📚 歡迎來到我的Java八股文專欄! 🎉各位程序員小伙伴們好呀~ 👋 我是雪碧聊技術,很高興能在CSDN與大家相遇!?🚀 專欄介紹這個專欄將專注于分享Java面試中的經典"八股文"知識點 &…

Java實戰:基于Spring Cloud的電商微服務架構設計——從拆分到高可用的全流程解析

引言 2023年雙十一大促期間,某傳統電商平臺的單體應用再次“爆雷”:凌晨1點訂單量突破50萬單/分鐘時,用戶服務因數據庫連接池被訂單模塊占滿,導致登錄接口響應時間從200ms飆升至5秒,大量用戶流失。技術團隊緊急回滾后發現:這個運行了7年的單體應用,早已變成“代碼泥潭”…

STL學習(二、vector容器)

1.vector構造函數函數原型vector<int> v // 默認構造&#xff0c;size為0vector(const_iterator beg, const_iterator end) // 將v的[begin, end) 元素拷貝過來vector(n, elem) // 構造函數將n個elem拷貝到本身vector(const vector & v) // 拷貝構造2.vect…