专业汉语词典知识平台,分享汉字词语知识、历史文学知识解答!

励北网
励北网

静态变量的特点,深入理解静态变量

来源:小易整编  作者:小易  发布时间:2023-03-17 07:53
摘要:静态变量的特点,深入理解静态变量全局静态变量数据存储:已初始化的存储在数据区中的已初始化变量区。未初始化的存储在数据区中的未初始化变量区。作用域:文件作用域。本质:是受编译器按语法约束的全局变量。作用:私有化某些变量和方法,以文件为单位对源...

#include <stdio.h>#include <stdlib.h> void TestLocal(){    static int nTest1 = 0x996;    printf("%d\r\n",nTest1);}  int main(){    TestLocal();    system("pause");    return 0;}

将以上代码编译称为obj文件。
 
打开obj文件,搜索局部静态变量名nTest1:
 

静态变量的特点,深入理解静态变量

 
其在vc6.0的c编译器下的名称粉碎为:
 
_?nTest1@?1??TestLocal@@9@9
 
将其局部静态变量放入函数内的代码块中,编译后观察名称粉碎的变化:

void TestLocal(){    {        static int nTest1 = 0x996;        printf("%d\r\n",nTest1);    }}

其名称粉碎后的结果为
 
_?nTest1@?2??TestLocal@@9@9
 
可以看到由?1变成了?2这里大致可以推测,?x表示层级。
 
名称粉碎识别关键参数
  • 变量名

  • 作用域名

  • 作用域的层级编号

全局静态变量不进行名称粉碎不影响从标识符到内存地址的识别,局部静态变量不名称粉碎会影响。
 
编译器通过名称粉碎的方式做语法检查,关键是集成了变量名、作用域名、作用域的层级编号。

局部静态变量只能被赋一次初值的原因

static int snTest = 999;

上述代码是给编译器看的,告诉编译器全局变量的snTest的初值为999。
 
静态局部变量定义处没有产生赋值的汇编代码,所以在函数执行时不会被赋值。
 

静态变量的特点,深入理解静态变量

局部静态变量初始化为常量的值

静态局部变量如果赋初值,则会和已初始化的全局变量一样被写入到文件中,存储在数据区中的已初始化的全局变量区。
 

静态变量的特点,深入理解静态变量

 
查看exe文件26a30处:
 

静态变量的特点,深入理解静态变量

 
如果未赋初值,则会存储在未初始化的全局变量区,都不会产生赋值的汇编指令。
 

静态变量的特点,深入理解静态变量

局部静态变量初始化为变量的值

void fooD(int n){    static int nTest = n;}

在C编译器下报错error C2099: initializer is not a constant
 
在C++编译器环境下
 
c++的语法允许局部静态变量初始化为变量的值,c语言不允许。
 
当采用C++编译器时,名称粉碎规则会发生改变。
 
调用方式、返回值、函数参数、及函数参数的数量均会影响到其名称粉碎规则的改变。
 

静态变量的特点,深入理解静态变量

 
_?nTest1@?1??TestLocal@@YAXH@Z@4HA
 
VC++6.0 Debug中watch窗口解析名称粉碎bug
 
watch窗口用的C编译器的名称粉碎规则,所以其无法正常显示cpp文件中的局部静态变量信息。
 

静态变量的特点,深入理解静态变量

 
当静态局部变量赋初值为变量时,储存在未初始化区,会产生代码。
 
会产生汇编代码:
 

静态变量的特点,深入理解静态变量

 
存储在未初始化全局变量区:

本文地址:百科问答频道 https://www.neebe.cn/wenda/931319_3.html,易企推百科一个免费的知识分享平台,本站部分文章来网络分享,本着互联网分享的精神,如有涉及到您的权益,请联系我们删除,谢谢!


百科问答
小编:小易整编
相关文章相关阅读
  • win10环境变量怎么设置?在Windows 10中创建环境变量的3种方法(详细)

    win10环境变量怎么设置?在Windows 10中创建环境变量的3种方法(详细)

    设置环境变量是编程过程中经常需要做的事情,这里我们来讨论如何在Windows10中创建环境变量。Windows中的环境变量是包含有关系统环境和当前登录用户信息的值。除了Windows之外,环境变量也存在于微软之前的操作系统中,例如MS-D...

  • classpath环境变量作用,Java环境变量classpath的作用

    classpath环境变量作用,Java环境变量classpath的作用

    classpath环境变量作用,Java环境变量classpath的作用环境变量环境变量(environmentvariables)一般是指在操作系统中用来指定操作系统运行环境的一些参数,如:临时文件夹位置和系统文件夹位置等。环境变量是在操...

  • linux怎么设置环境变量,linux设置环境变量的6种方法

    linux怎么设置环境变量,linux设置环境变量的6种方法

    linux怎么设置环境变量,linux设置环境变量的6种方法Linux读取环境变量读取环境变量的方法:export命令显示当前系统定义的所有环境变量echo$PATH命令输出当前的PATH环境变量的值这两个命令执行的效果如下其中PATH变量...

  • 如何定义全局变量,C语言定义全局变量

    如何定义全局变量,C语言定义全局变量

    如何定义全局变量,C语言定义全局变量全局变量C语言提供了全局变量的定义,全局变量也称为:外部变量。全局变量就是定义在函数外的变量。它不属于大括号{}包含的某个代码块,所以,它的作用域不是在某个代码块内,是在整个源程序中。所以,可以在源程序中...

  • 静态变量的特点,深入理解静态变量

    静态变量的特点,深入理解静态变量

    静态变量的特点,深入理解静态变量全局静态变量数据存储:已初始化的存储在数据区中的已初始化变量区。未初始化的存储在数据区中的未初始化变量区。作用域:文件作用域。本质:是受编译器按语法约束的全局变量。作用:私有化某些变量和方法,以文件为单位对源...

  • 静态ip怎么设置,如何设置静态ip地址

    静态ip怎么设置,如何设置静态ip地址

    静态ip怎么设置,如何设置静态ip地址静态IP地址是网络上计算机或设备的唯一地址。与由网络分配并随时间变化的动态IP地址不同,静态IP地址是固定的。静态IP地址对于需要远程访问其计算机或设备的用户非常有用,因为它可以确保地址不会更改并且连接...

  • 变量名是什么意思,变量名的命名原则

    变量名是什么意思,变量名的命名原则

    变量名是什么意思,变量名的命名原则现在我们来看一下变量的三大组成部分。首先的就是变量名,它指向的就是等号右侧的值的内存地址,是用来访问右侧的值的。然后就是赋值符号‘=’等号,它是用来将变量值的内存地址绑定给变量名的。最后就是变量值,它是表示...

  • 自学Java2(保姆级教学)——常量与变量

    自学Java2(保姆级教学)——常量与变量

    自学Java2(保姆级教学)——常量与变量顾名思义,常量就是在程序运行过程中,其值不会发生改变的量;变量则是在程序运行过程中其值可以发生改变的量。常量比较好理解,这里着重讲变量,而变量的主要作用就是取值和修改值。首先我将书上对变量的解释写一...

  • 周排行
  • 月排行
  • 年排行

精彩推荐