C++ - 几类变量(局部、静态、静态全局、全局)简介

主要介绍下如题几类变量,也是比较容易弄混的四类变量,每一中变量都应该有自己独特的部分,才有存在的价值;

  存储区域 作用域与生存时间
局部变量 栈区 局部;在作用域内
全局变量 静态存储区 全局,多个源文件中可以使用;整个程序执行期间
静态局部变量   静态存储区   局部;整个程序执行期间
静态全局变量 静态存储区 全局,只能在本文件中使用;整个程序执行期间

所以说其实每类变量都会有自己与众不同的地方,对于局部变量,可以用于在局部作用域中使用,其余地方不访问,对变量有一定的保护作用,并且每次进入执行都会是一样的,

它的值不需要一直保存着,而如果想作用于局部,而且希望下次调用的使用该变量仍然能够保存上次的值,那么就可以使用静态局部变量。

静态存储区:是内存中的一块特殊的区域,若变量存储在静态存储区,会在程序编译的时候就为其分配空间,然后生存时间是整个程序执行期间。

对于C++内存区划分可以参考: C/C++堆、栈及静态数据区详解

分为五个区,堆、栈、自由存储区、静态存储区、常量存储区。

还是主要介绍下该如何查看存储的数据,主要说明存储在哪?什么时候分配?(Win8+VS2012)

断点设置在开始执行的位置,可以发现c、d、a都已经分配好空间了,并且都在同一区域(但我现在还不能证明这就是静态存储区),可以发现这块区域初始化都是0,因此不会是栈区,而且可以看出是四字节的整型数,并且按照c、d、a的顺序分配。

然后再看局部变量的分配,应该是在栈区,而对于栈区部分可以知道如果定义一个变量没有赋予初值,一般在VC里面会填充0xCC,所以对于栈区一般是会有很多被填充0xCC的区域:

可以从反汇编中看到这块区域,周围部分未使用(初始化)区域被填充的0xCC,这也是栈区的一个特征,所以基本上能够说明局部变量的确是被放置在栈区。

具体内存信息分配可以参考:内存区域的划分及堆栈的详解

其实前面是想通过定位函数调用,即在windows下面如果在堆中分配空间,会调用HeapAlloc函数,局部变量栈中分配会调用LocalAlloc函数之类的,但是不知道该如果调试定位进入该函数调用,望路过的大牛指导 ^^

时间: 2024-11-03 05:20:24

C++ - 几类变量(局部、静态、静态全局、全局)简介的相关文章

C和C++的面向对象专题(7)——单例模式解决静态成员对象和全局对象的构造顺序难题

本专栏文章列表 一.何为面向对象 二.C语言也能实现面向对象 三.C++中的不优雅特性 四.解决封装,避免接口 五.合理使用模板,避免代码冗余 六.C++也能反射 七.单例模式解决静态成员对象和全局对象的构造顺序难题 八.更为高级的预处理器PHP 七.单例模式解决静态成员对象和全局对象的构造顺序难题 上回书说道,我们的程序有一个隐藏的漏洞,如果ClassRegister这个类所在的.o文件,如果在所有.o文件中是第一个被链接的的,那么就不会出问题. 这么说太抽象了,让我们画个图表 ClassRe

[C++]LeetCode: 104 Jump Game II (局部最优和全局最优法)

题目: Given an array of non-negative integers, you are initially positioned at the first index of the array. Each element in the array represents your maximum jump length at that position. Your goal is to reach the last index in the minimum number of j

【C语言】局部变量、全局变量,局部静态变量,全局静态变量,extern,static的区别

局部变量: 创建在栈区(向下生长),生命周期存在于当前作用域中.     创建时若未初始化,则为随机值. 全局变量: 创建在static区,生命周期一直存在. 创建时若未初始化,则为0. 静态局部变量: 切断了外部链接属性.创建在static区. 创建时若未初始化,则为0. 全局变量和静态变量的存储是放在一块的,初始化了的全局变量和静态变量在一块区域,  未初始化的全局变量和未初始化的静态变量在相邻的另一块区域. 全局静态变量: 切断了外部链接属性,创建在static区,生命周期一直存在. 创建

静态一对一NAT全局地址同时用于PAT

一.说明 处理一故障,一台主机在思科路由器上做了一对一的静态NAT,从外面能正常通过NAT后的地址ssh登录该设备,但是该主机发送syslog,出来的地址却不是静态NAT后的地址,为路由器接口的地址. 二.原因 经过查看路由器的配置,除了做了静态NAT配置,还做了动态PAT的配置,但是动态配置ACL在前面增加该主机映射的内网地址的deny后,仍然没有效果.登录设备之后,才发现,映射的内网地址,其实是网卡的浮动地址,因为主机主动与外界通讯,不会以浮动地址作为源地址,所以该地址出去时做PAT. 三.

java 成员变量、局部变量、静态变量、类变量、非静态变量、实例变量、向前引用、非法向前引用、静态代码块、非静态代码块

①java类的成员变量有俩种: 一种是被static关键字修饰的变量,叫类变量或者静态变量 另一种没有static修饰,为成员变量 ②通俗点说: 类的静态变量在内存中只有一个,java虚拟机在加载类的过程中为静态变量分配内存,静态变量位于方法区,被类的所有实例共享.静态变量可以直接通过类名进行访问,其生命周期取决于类的生命周期. 而实例变量取决于类的实例.每创建一个实例,java虚拟机就会为实例变量分配一次内存,实例变量位于堆区中,其生命周期取决于实例的生命周期. 注意点: 1.JAVA中初始化

laravel5.3-数据库操作下的局部or条件与全局or条件(orWhere的局部与全局)

当用户名不为空时 SELECT * FROM `ACCOUNT_RECHARGE` LEFT JOIN `ORDER` ON `ACCOUNT_RECHARGE`.`OrderNo` = `ORDER`.`OrderNo` LEFT JOIN `USER_ACCOUNT` ON `ORDER`.`UserId` = `USER_ACCOUNT`.`UserId` WHERE (`USER_ACCOUNT`.`UserName` LIKE '%18%' OR (`USER_ACCOUNT`.`Mo

实例、局部、静态变量(java)

实例变量:如果在类的方法代码段之外声明且没有限定词static,则为实例变量.实例是对象的另一种叫法. 局部变量:如果在类的方法体之中声明,则为局部变量.() 静态变量:如果将一个实例变量声明为static,则为静态变量,或称之为类变量. 静态变量在类声明后就可以直接引用,但实例变量必须在实例化对象后才可以使用. 静态变量既不在栈中,也不在堆中,专门放在静态存储区中.(如书中的v2=0=200=400,最后v2的值就是400) 静态方法和类是同时出现的, 后出生的可以访问先出生的, 类名不可以访

[C++]LeetCode: 103 Jump Game (局部最优和全局最优法)

题目: Given an array of non-negative integers, you are initially positioned at the first index of the array. Each element in the array represents your maximum jump length at that position. Determine if you are able to reach the last index. For example:

java局部/成员/静态/实例变量

局部变量和成员变量主要是他们作用域的区别成员变量个是类内部:局部变量是定义其的方法体内部(或者方法体内部的某一程序块内——大括号,主要看定义的位置).另外,成员变量可以不显式初始化,它们可以由系统设定默认值:局部变量没有默认值,所以必须设定初始赋值. java类的成员变量有俩种:一种是被static关键字修饰的变量,叫类变量或者静态变量:另一种没有static修饰,为实例变量. 在语法定义上的区别:静态变量前要加static关键字,而实例变量前则不加. 在程序运行时的区别:实例变量属于某个对象的