深入解析C/C++函數變量傳遞:棧、堆與全局變量的生命周期之旅

資料合集下載鏈接:

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

在編程學習中,函數是構建程序的基石,而理解變量如何在函數之間正確、安全地傳遞,則是從入門到進階的關鍵一步。我們經常會遇到這樣的困惑:為什么一個指針在某個函數里工作正常,傳遞給另一個函數后卻變成了“野指針”?為什么有些變量可以“跨越”函數邊界,而有些卻“閱后即焚”?

本文將基于一份課堂筆記的核心思想,通過理論結合實踐,帶您深入探索C/C++中變量傳遞的底層邏輯,徹底搞懂局部變量、堆區數據、棧區數據和全局區數據在函數調用鏈中的生命周期與可訪問性。

一、 核心概念:變量的“家”在哪里?

在探討變量傳遞之前,我們必須先了解一個變量在程序運行時“居住”在內存的哪個區域。C/C++程序的內存空間主要分為以下幾個區域:

  1. 1. 棧區 (Stack): 由編譯器自動分配和釋放。主要存放函數的參數值、局部變量等。其操作方式類似于數據結構中的“棧”,函數調用時入棧,函數返回時出棧。這里的內存生命周期與函數綁定,函數結束,內存即被回收。
  2. 2. 堆區 (Heap): 由程序員手動分配和釋放(如C中的??malloc??/??free??,C++中的??new??/??delete??)。若不手動釋放,程序結束時可能由操作系統回收。堆區的生命周期不與任何特定函數綁定,因此可以實現數據的跨函數共享。
  3. 3. 全局/靜態區 (Global/Static Area): 存放全局變量和靜態變量。這部分內存在程序整個運行期間都存在,直到程序結束才被釋放。
  4. 4. 代碼區 (Code Area): 存放函數體的二進制代碼。

理解了這四個區域,我們就能更好地理解筆記中提到的變量傳遞規則。

二、 函數變量傳遞的四大基本法則

根據課堂筆記的總結,我們可以將函數間變量的可訪問性歸納為以下四條黃金法則:

法則一:棧區數據,函數私有,隨生隨滅。
函數內部定義的局部變量(未用??static??修飾)存儲在棧區。它們的生命周期僅限于當前函數的執行過程。一旦函數執行完畢,其對應的棧幀(stack frame)被銷毀,所有局部變量也隨之消失。因此,絕對不能返回一個指向局部變量的指針或引用,因為調用者收到這個指針時,它所指向的內存已經無效,訪問它將導致未定義行為(Undefined Behavior)。

法則二:堆區數據,手動管理,跨函數共享。
通過??malloc??或??new??在堆區開辟的數據,其生命周期由程序員掌控。只要沒有被??free??或??delete??,這塊內存就一直有效。函數可以安全地返回一個指向堆區內存的指針,調用者函數可以通過這個指針訪問和操作數據。當然,調用者也因此承擔了在未來某個時刻釋放這塊內存的責任,否則會造成內存泄漏。

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

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

相關文章

Ubuntu18網絡連接不上也ping不通網絡配置問題排查與解決方法

Ubuntu 18啟動以后發現連接不上網絡,執行 ip a命令或者ifconfig都顯示不了正確的地址(192.168.xxx.xxx)。 剛裝好系統是沒問題的,打算使用FTP開啟ftp服務與windows互傳文件,安裝了net-tools插件就突然連不上網絡了,懷疑是網絡配置被修改了。 經過了一段時間折騰終于解決了,…

【計算機網絡】Socket網絡編程

目錄 一、主機字節序列和網絡字節序列 二、套接字地址結構 1、IPv4 地址結構 (sockaddr_in) 2、IPv6 地址結構 (sockaddr_in6) 3、通用套接字地址結構 (sockaddr) 4、Unix域套接字地址結構 (sockaddr_un) 5、專用 socket 地址結構 6、套接字地址結構的轉換 字符串轉二進制地址 …

網頁操作自動化解決方案:如何用Browser-Use+CPolar提升企業運營效率

文章目錄前言1. 安裝Ollama2. Gemma3模型安裝與運行3. 虛擬環境準備3.1 安裝Python3.2. 安裝conda4. 本地部署Brower Use WebUI4.1 創建一個新conda環境4.2 克隆存儲庫4.3 安裝依賴環境4.4 安裝瀏覽器自動化工具4.5 修改配置信息5. 本地運行測試6. 安裝內網穿透6.1 配置公網地址…

Pycharm的設置過程

20250802 用于記錄pycharm的設置過程 編輯器相關 python語言設置文件注釋 在設置的編輯器部分,按照需求設置模板! 函數生成注釋

GaussDB as的用法

通過使用 SQL,可以為表名稱或列名稱指定別名(Alias)。1 別名的作用SQL 別名用于為表或表中的列提供臨時名稱。 SQL 別名通常用于使列名更具可讀性。 SQL 一個別名只存在于查詢期間。 提高SQL執行效率與編寫SQL代碼效率。2 使用別名的場景在下…

Prim算法

一,prim算法邏輯1.理解:克魯斯卡爾算法關注的是邊,普里姆算法關注的是點把圖中每個頂點比作孤島,點亮一座孤島就可以解鎖附近的孤島每次解鎖的點都是離自身最近的點2.普里姆算法流程a.采用鄰接矩陣表示,考慮要查找最小…

嵌入式學習之硬件——51單片機 1.0

一、基礎知識1.什么是嵌入式?嵌入式以應用為中心,計算機技術為基礎,軟硬件可裁剪的專用計算機系統;2.嵌入式的應用?消費電子、無人駕駛、儲能、新能源........3.嵌入式發展?(1)第一階…

51c大模型~合集161

自己的原文哦~ https://blog.51cto.com/whaosoft/14079111 #這家國內公司,在給xx智能技術棧做「通解」 打通機器人智能化的關鍵:眼腦手。 xx智能(Embodied Intelligence)是 AI 領域里熱度極高的賽道:給大模型…

Linux9 root密碼修改

開機按e進入在linux行即quiet后面輸入rd.break ctrlx進入內核輸入mount -o remount,rw /sysrootchroot /sysrootpasswd root即可修改密碼輸入touch /.autorelabelexitexit等待即可

提示詞增強工程(Prompt Enhancement Engineering)白皮書草稿

提示詞增強工程(Prompt Enhancement Engineering)白皮書草稿 作者: 技術人進化社 Email:2819699195qq.com 日期: 2025年7月30日 1. 引言 隨著大型語言模型(LLM)能力的飛速發展,如何高…

電路元器件

電流單位 電壓 電阻單位 電阻的決定式 歐姆定律 交流電和直流電 交流電 串聯電路 并聯電路 在線模擬器 Circuitjs web 在線電路模擬器 下載

廣泛分布于內側內嗅皮層全層的速度細胞(speed cells)對NLP中的深層語義分析的積極影響和啟示

速度細胞(Speed Cells)作為內側內嗅皮層(MEC)的核心神經元,通過編碼運動速度信息與網格細胞協同實現動態路徑整合。這一神經機制為自然語言處理(NLP)的深層語義分析提供了以下關鍵啟示和影響&am…

sql中的多表查詢

在SQL中,多表查詢用于從多個表中組合數據,常見的方法包括 ?連接查詢(JOIN)?? 和 ?子查詢。以下是詳細說明和示例:一、連接查詢(JOIN)通過關聯字段將多個表的數據合并,分為以下幾…

Ruby 面向對象編程深入解析

Ruby 面向對象編程深入解析 引言 Ruby 作為一種動態、解釋型、面向對象的語言,自1995年由日本程序員Yukihiro Matsumoto創造以來,憑借其簡潔、靈活和強大的面向對象特性,在全球范圍內獲得了廣泛的認可。本文將深入探討Ruby的面向對象編程(OOP)特性,幫助讀者更好地理解和…

Baumer工業相機堡盟工業相機如何通過YoloV8深度學習模型實現圍欄羊駝的檢測識別(C#代碼,UI界面版)

Baumer工業相機堡盟工業相機如何通過YoloV8深度學習模型實現圍欄羊駝的檢測識別(C#代碼,UI界面版)工業相機使用YoloV8模型實現圍欄羊駝的檢測識別工業相機通過YoloV8模型實現圍欄羊駝的檢測識別的技術背景在相機SDK中獲取圖像轉換圖像的代碼分…

如何利用 rowid 在OceanBase 中處理大表時提效

本文作者:張瑞遠,現主要從事電信級IT系統及數據庫的規劃設計、架構設計、運維實施、運維服務、故障處理、性能優化等工作,曾經從事銀行、證券數倉設計、開發、優化類工作,持有Orale OCM,MySQL OCP及國產代表數據庫認證。 獲得包括…

【從0開始學習Java | 第4篇】類和對象

文章目錄👏類和對象的概念什么是類?什么是對象?🥝構造方法如何創建一個對象?🥝對象內存布局完整應用 - 編寫一個類:人,其具備年齡、性別、姓名等基礎屬性,并實例化一個人…

Synopsys:默認報告精度(report_default_significant_digits變量)

相關閱讀 Synopsyshttps://blog.csdn.net/weixin_45791458/category_12812219.html?spm1001.2014.3001.5482 在使用report_timing之類的報告命令時,可以使用-significant_digits選項指定報告的精度,在不使用該選項的情況下,命令使用由repor…

2025年藍橋杯青少圖形化編程國考真題——擺放玩具

編程實現擺放玩具。(角色非源素材)擺放規則:在方格中擺放玩具,每個方格只能擺放一個,并且如果某個方格中已經擺放了玩具,那么與之上、下、左、右相鄰的四個方格中無法再擺放同種玩具。具體要求1&#xff09…

Android 應用的安裝流程

安裝流程總覽: 用戶觸發安裝->系統驗證APK的合法性->解析APK元數據->檢查權限和存儲空間->復制APK到目標位置->生成應用私有數據->注冊組件到系統->安裝完成 關鍵步驟: 1.用戶觸發安裝:a.通過應用商店b.通過adb命令c.通…