【Linux】程序地址空间回顾

news2024/10/7 4:34:56

我们的地址空间划分成如下几个区域:

代码区,字符常量区,已初始化全局变量区,未已初始化全局数据区,堆区,栈区;其中有代码区至栈区的代码地址依次增大。

局部变量是具有临时性的局部变量,在栈上开辟

我们在C,C++上malloc时候申请的叫做堆空间,是在堆区开辟的。

我们平时那么定的全局变量可以对所有的函数访问,是因为全局变量在全局数据区

请问,在这个图当中,我们所展示的这个东西,它是内存吗?

答案是:不是,这个东西其实是地址空间,C,C++程序是以这样的方式分布的。


验证地址空间的增长方向

①首先我们要打印的一个区域的代码区:

现在要打代码的地址,可是我们要以谁做为我们对应的代码区呢?

在我们整个的代码当中,我们就有一个叫做main函数的函数,其中函数名代表的就是它的地址

我们用main函数充当我们代码区的地址,所以代码区的地址我们就有了:

②字符常量序区,那么需要有个字符常量:

那么告诉我%p这里我们在输出的时候,那么是需要输出的是str呢?还是&str呢?还是*str呢?

那么很显然,我们要打的是这个字符串常量,它的起始地址在str变量里面。字符指指针变量也是变量,它里面保存的就是这个字符串的起始地址,所以打印str就行了

③我们要打印已初始化全局变量和未初始化变量:

在main函数外定义两个全局变量,如图:

打印:

④我们要打印堆区:

请问这次在打印时打印的是men还是&men呢?

答案是:men,因为要打印的是堆它对应的地址;

⑤打印栈的地址:

那么我们栈区的变量在哪呢?

我们在函数当中定义的变量叫做局部或者临时变量,调用函数时形成该变量,函数返回时该变量被释放。

那么为什么呢?
因为调用函数时,我们需要在栈上为该函数申请,我们对应的栈空间的。
那么同样的,main函数也是函数。所以之前定义的str,men都是局部变量,局部变量在我们对应的栈上。

所以我们这里取地址是这样。

所以整个代码:

运行打印:

我们可以看到它就在这里依次向上增长



脑子里只要有这张图。
我们就知道 c语言当中全局变量,局部变量还有很多变量,那么它为什么那么最终临时变量就临时性呢?全局变量为什么一直有效?原因我们就能清楚了。

其中我们要知道栈区,它是向地址减少方向增长,向下增长。
而我们的堆区,它是向地址增大方向增长,也就是堆栈相对而生


验证栈,堆地址的增长方向:

验证栈的增长方向:

打印结果:

那么为什么是向地址减少的方向增长呢?
因为栈向地址减小方向增长,先定义的变量,先入栈,后定义变量后入栈,所以它的地址当然会小。

验证堆空间:

打印结果:

你会发现堆和栈它两个的地址差别很大,它两个之间有一大段的镂空。那么这段镂空是什么?我们后面讲动静态库的时候再说。反正呢,那么堆栈是相对而生的。我们这么理解就OK了来。


验证关于static的语法问题

我们知道全局变量它会一直存在,并不随着一个函数的调用和返回,这个全局变量不会释放。那么这就说明,不论是你初始化还是未初始化,只要是全局变量,这个区域我们统称为全局数据区。

在学c语言的时候,我们有一种变量叫做static,那么把我们对应的一个变量用static这个来进行修饰。

static并不会随着这个函数的使用完毕而释放,它只做一次初始化,首次调制函数是初始化。往后它就直接使用这个变量。这个函数它的生命周期就不随着函数的调用和释放,或者是返回这个变量就不会释放了。

问题是,为什么我们用static这个变量一修饰这个a,那么它就不会被释放了呢?

打印结果:

对比全局变量:

说明我们对应的static修饰的叫做局部变量,编译的时候已经被编译到全局数据去了,所以它才不会随着你函数的调用,然后去自动释放的,因为它已经是一种全局变量了。

只不过它是那么身在曹营,身不由己。
static在一个函数代码块里,所以它只能在这个代码块里面被使用,这叫做这个变量,作用域只能在函数里面但是它的生命周期已经是全局了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1183212.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

springboot项目中手动提交事务

springboot项目中手动提交事务 演示主要代码场景/需求/实际效果解决办法 :在mi方法中手动提交事务Spring的7中事务传播行为 演示主要代码 Service 层代码 import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.an…

GPT-4 Turbo:OpenAI发布旗舰版GPT-4模型,更便宜|更强大|128K上下文|支持多模态

一、介绍 OpenAI 在 2023 年 11 月 7 日举行首届开发者大会,此次展会的亮点无疑是 GPT-4 Turbo 的亮相,它是 OpenAI 著名的 GPT-4 模型的升级版。 GPT-4 Turbo 有两种变体:一种用于文本分析,另一种能够理解文本和图像。 GPT-4 Tu…

Java 设计模式——解释器模式

目录 1.概述2.结构3.案例实现3.1.抽象表达式类3.2.终结表达式3.3.非终结表达式3.4.环境类3.5.测试 4.优缺点5.使用场景 1.概述 (1)如下图,设计一个软件用来进行加减计算。我们第一想法可能就是使用工具类,提供对应的加法和减法的…

第十三章 Python操作数据库

系列文章目录 第一章 Python 基础知识 第二章 python 字符串处理 第三章 python 数据类型 第四章 python 运算符与流程控制 第五章 python 文件操作 第六章 python 函数 第七章 python 常用内建函数 第八章 python 类(面向对象编程) 第九章 python 异常处理 第十章 python 自定…

基于SSM的本科生导师指导平台设计实现

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:Vue 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目:是 目录…

Scala语言使用Selenium库编写网络爬虫

目录 一、引言 二、环境准备 三、爬虫程序设计 1、导入必要的库和包 2、启动浏览器驱动程序 3、抓取网页内容 4. 提取特定信息 5. 数据存储和处理 四、优化和扩展 五、结语 一、引言 网络爬虫是一种自动抓取互联网信息的程序。它们按照一定的规则和算法,…

【VSS版本控制工具】

VSS版本控制工具 1 安装 VSS2 服务器端配置3 新建用户4 客户端配置Vss2005Vs20055 客户端详细操作 1 安装 VSS 第一步:将VisualSourceSafe2005安装包解压。 第二步:找到setup.exe双击运行。 第三步:在弹出的界面复选框中选中Iaccepttheterms…

Effective C++ 条款5:了解C++默默编写并调用哪些函数

编译器为一个空类声明一个拷贝构造函数、一个拷贝赋值操作符和一个析构函数,如果没有声明任何构造函数,编译器也会声明一个默认构造函数,所有的这些函数都是public且inline 因此,如果写下: class Empty{};…

少儿编程 2023年9月中国电子学会图形化编程等级考试Scratch编程三级真题解析(判断题)

2023年9月scratch编程等级考试三级真题 判断题(共10题,每题2分,共20分) 19、运行程序后,“我的变量”的值为25 答案:对 考点分析:考查积木综合使用,重点考查变量和运算积木的使用 开始我的变量为50,执行完第二行代码我的变量变为49,条件不成立执行否则语句,所以…

DBever 连接trino时区问题 The datetime zone id ‘GMT+08:00‘ is not recognised

DBever连接trino 测试连接成功,但是执行sql报时区不对、如果你默认使用的是大于jdk8的版本 会存在这个问题,因为jdk版本 jdk8 和jdk17 版本默认时区是不同的 trino官网明确说明了时区默认跟jdk走 解决方案 可以先行查看JDK本地时区库版本,执…

开发记录【1】

给列表加上序号 实现:Oracle有自带序号rownum,加上这个字段即可 【开发细节1】更新人可通过共享组件获取 【开发细节2】存入部门ID,想让其展示部门名,使用了共享组件,但是没显示,这是为什么呢? 【原因及解…

Python高级进阶(2)----Python装饰器的艺术

文章目录 装饰器基础示例代码:执行结果:参数化装饰器示例代码:执行结果:类装饰器示例代码:执行结果:装饰器的堆栈示例代码:执行结果:在Python中,装饰器是一种非常强大的特性,允许开发人员以一种干净、可读性强的方式修改或增强函数和方法。以下是一个关于Python装饰器…

当爱好变成职业,会不会就失去了兴趣?

当爱好变成职业,会不会就失去了兴趣? 当兴趣变成职业 1、学习能力变强了,积极主动性增加了。 2、学习努力变现了,赚到的更钱多了。 3、赚钱能力变强了,反过来再次促使兴趣发展(兴趣更大了....干劲更足了&…

SpringCloud——服务容错——Hystrix

1.现在的微服务存在哪些问题? 在大型的微服务项目中,肯定少不了服务之间多条链路调用,如果调用中有一个服务出现了问题,如果不做任何的处理,就会造成大量的阻塞,可能会导致整个服务雪崩。 2.要解决的问题 …

SpringCloud——服务网关——GateWay

1.GateWay是什么? gateway也叫服务网关,SpringCloud GateWay使用的是Webflux中的reactor-netty响应式编程组件,底层使用了Netty通讯框架。 gateway的功能有反向代理、鉴权、流量控制、熔断、日志监控...... 2.为什么不使用Zuul&#xff1f…

如何对IP地址进行定位

IP地址是互联网上用于标识和定位设备的关键元素。通过对IP地址进行定位,您可以确定设备的大致地理位置,这对于网络管理、安全监控和地理定位服务都非常有用。本文将介绍如何对IP地址进行定位的方法以及相关的重要注意事项。 IP地址定位的基本原理 IP地…

SpringCloud——服务注册——Eureka

1.Eureka概述 2.Eureka架构: Eureka中80服务要实现对8001和8002服务访问的负载均衡,需要在80服务的RestTemplate上面加LoadBalanced注解,默认采用的是轮询的策略。 3.Eureka自我保护 当一个EurekaClient注册进EurekaServer,Eurek…

佳能相机拍出来的dat文件怎么修复为正常视频

3-3 佳能相机是普通人用得最多的相机之一,也有一些专业机会用于比较重要的场景,比如婚庆、会议录像、家庭录像使用等。 但作为电子产品,经常会出现一些奇怪的故障,最严重的应该就是拍出来的东西打不开了。 本文案例是佳能相机拍…

自动还款业务事故案例,与金融场景幂等性思考

一、自动还款业务 事故 案例 事故名称: 自动还款业务事故 事故描述: 事故发生时间:201x-0x-18 0x:15:00 事故响应时间:201x-0x-20 0x:18:00 事故解决时间:201x-0x-20 0x:28:00 事故现象: 自动扣款,出现扣款…

中远麒麟堡垒机SQL注入漏洞复现

简介 中远麒麟堡垒机用于运维管理的认证、授权、审计等监控管理,在该产品admin.php处存在SQL 注入漏洞。 漏洞复现 FOFA语法: body"url\"admin.php?controlleradmin_index&actionget_user_login_fristauth&username" 或者 c…