资料合集下载链接:

​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.通…