精华内容
下载资源
问答
  • 我们先看一下全局变量在反汇编中是怎么体现的,如示例示例代码CH07_3_4。#include#includeint i = 2;int main(void){int j = i;return 0;}1: #include2: #include3: int i = 2;4: int main(void)5: {...

    全局变量的作用域是从全局变量定义的位置到本源文件结束都有效。

    我们先看一下全局变量在反汇编中是怎么体现的,如示例示例代码CH07_3_4。

    #include

    #include

    int i = 2;

    int main(void)

    {

    int j = i;

    return 0;

    }

    1: #include

    2: #include

    3: int i = 2;

    4: int main(void)

    5: {

    00401010 push ebp

    00401011 mov ebp,esp

    00401013 sub esp,44h

    00401016 push ebx

    00401017 push esi

    00401018 push edi

    00401019 lea edi,[ebp-44h]

    0040101C mov ecx,11h

    00401021 mov eax,0CCCCCCCCh

    00401026 rep stos dword ptr [edi]

    上面的代码就不再分析了,下面是重点。

    6: int j = i;

    00401028 mov eax,[i (00421a30)]

    这一行中(00421a30)正是全局变量i的存放地址。

    全局变量编译的时候就已经确定了内存地址和宽度,变量名就是内存地址的别名。如果不重新编译(也就是不重新构建程序),全局变量的内存地址将不会改变。

    0040102D mov dword ptr [ebp-4],eax

    7: return 0;

    00401030 xor eax,eax

    8: }

    8c7ec214941eba53e75cea7f38b7f406.png

    图7-3-22

    总结:全局变量保存在内存的全局区中,占用静态的存储单元。说到静态的存储单元,这里还要提一下全局变量分为:全局变量和静态全局变量。全局变量的定义请看示例代码CH07_3_4,而静态全局变量,只是在int i = 2;前加static关键字。

    书写形式:static int i =2;

    全局变量与静态全局变量有什么区别?

    全局变量作用范围:从全局变量定义的位置到本源文件结束都有效,如果想在别的文件中访问可以加上extend声明,书写形式:extend int i = 2;详细介绍请看第十章文件。

    静态全局变量作用范围:只在定义它的文件中可用,而文件之外是不可以被看见的。静态全局变量就是用来解决重名问题的,使用静态全局变量就是告诉编译器这个变量只在当前文件使用,在别的文件中就不可以使用。

    对于一个完整的程序:内存分布有如下几个区、栈区、堆区、全局区、常量区、代码区。

    de2a12c2fc695f5c8b9fb4b99e4a18eb.png图7-3-22

    图7-3-22有几个没有介绍到,以后的章节中会补充,这里要有这么几个概念。我们看代码示例CH07_3_5,代码中又不理解的地方,不要着急,在后续的章节中会介绍到。

    #include

    #include

    //全局区

    int g_n1 = 1;//全局初始化区

    char g_c2 ;//全局未初始化区

    void funtion()

    {

    int a = 1;

    }

    int main(void)

    {

    int nNum = 1;//栈区

    char cStr2[] = "123";//栈区

    char *cStr1 = "hello";//cStr1在栈区,hello\0在常量区

    static int nNum1 = 0;//全局初始化区

    char *pCStr = (char *)malloc(10);//分配10字节区域在堆区

    strcpy(pCStr, "666");//666放在常量区

    printf("程序代码区的地址\n");

    printf("funtion=%08X\n", funtion);

    printf("文字常量区 常量的地址\n");

    printf("&cStr1=%08X\n", &cStr1);

    printf("&pCStr=%08X\n", &pCStr);

    printf("全局区变量的地址\n");

    printf("&g_n1=%08X\n", &g_n1);

    printf("&g_c2=%08X\n", &g_c2);

    printf("&nNum1=%08X\n", &nNum1);

    printf("栈区 变量的地址\n");

    printf("&nNum=%08X\n", &nNum);

    printf("&cStr2=%08X\n", &cStr2);

    printf("堆区 空间的地址\n");

    printf("pCStr=%08X\n", pCStr);

    free(pCStr);//释放

    system("pause");

    return 0;

    }

    运行结果:

    69f5f1b682729b4d116e03dc2e905255.png图7-3-23

    举报/反馈

    展开全文
  • 本例说明了一个程序运行的时候,各种变量所保存的位置。因为位置不同,自然,变量的生命周期也各不相同。代码示例:#include using namespace std;...//显示函数中的临时变量的地址,应该位于程序的栈里cout&...

    本例说明了一个程序在运行的时候,各种变量所保存的位置。因为位置不同,自然,变量的生命周期也各不相同。

    代码示例:

    #include

    using namespace std;

    int nGNum1;

    void showStackAddress()

    {

    cout<

    int nStackNum1 = 10;

    static int snNum2 = 10;

    //显示函数中的临时变量的地址,应该位于程序的栈里

    cout<

    //显示函数内部的静态变量,该地址应该与全局变量在一起。整数型的静态变量被初始化为0

    cout<

    }

    int main(int argc, char ** argv)

    {

    //显示程序的代码段的地址

    cout<

    char * pcToArgv0 = argv[0];

    int nNum1 = 10;

    int *pnNum1 = new int (10);

    static int snNum1;

    //显示函数中的临时变量的地址,应该位于程序的栈里

    cout<

    //显示全局变量的地址。整数型的全局变量被初始化为0

    cout<

    //显示函数内部的静态变量,该地址应该与全局变量在一起。整数型的静态变量被初始化为0

    cout<

    //显示程序中的一些数据的地址。

    cout<

    //显示函数中用new手工生成的变量的地址,应该位于程序的堆里

    cout<

    showStackAddress();

    delete pnNum1;

    return 0;

    }

    编译:

    用eclipse 自己编译的,实际上使用这个命令:

    g++ -O0 -g3 -Wall -c -fmessage-length=0 -o cpptest_main.o ..\cpptest_main.cpp

    g++ -o cpptest.exe cpptest_main.o

    以下是程序的处理结果:

    process [D:\projects\eclipse\cpptest\Debug\cpptest.exe] start @[0x4017e1]

    the address of nNum1 is:     [0x22fec8]. value is:    [10]

    the address of nGNum1 is:     [0x407020]. value is:    [0]

    the address of snNum1 is:     [0x407028]. value is:    [0]

    the address of argv[0] is:     pcToArgv0 @ [0x22fecc] to [0x341f28]. value is:    [D:\projects\eclipse\cpptest\Debug\cpptest.exe]

    the address of heap is:     pnNum1 @ [0x22fec4] to [0x341f60]. value is:    [10]

    address of showStackAddress() is:    [0x4016b0]

    the address of nStackNum1 is:     [0x22fe9c]. value is:    [10]

    the address of snNum2 is:     [0x404000]. value is:    [10]

    程序说明:

    一个程序在运行过程中,代码保存在代码段,临时变量保存在栈里,用new等手工生产的数据保存在堆里,一些没有名字的变量,也保存在堆里,例如argv[0],程序的全局变量和静态(局部)变量保存全局数据区。

    全局变量和静态局部变量在定义的时候如果没有初始化,系统会为其进行初始化,例如,整型会被设定成数字0。

    展开全文
  • Java全局变量存放在哪里

    千次阅读 2021-02-12 18:46:20
    我们说 常量,静态变量存放在方法区中,方法中的临时变量,存放到Java 虚拟栈中。有人问,那全局变量*(对象)存放在哪里. 其实全局变量就是参考文章中所说的class的字段,就是指全局变量,它是存放方法区中的。e)...

    197a3632e633

    我们说 常量,静态变量存放在方法区中,方法中的临时变量,存放到Java 虚拟栈中。有人问,那全局变量*(对象)存放在哪里. 其实全局变量

    就是参考文章中所说的class的字段,就是指全局变量,它是存放在方法区中的。e)方法区

    与堆一样,是被线程共享的区域。在方法区中,存储了每个类的信息(包括类的名称、方法信息、字段信息)、静态变量、常量以及编译器编译后的代码等。

    在Class文件中除了类的字段、方法、接口等描述信息外,还有一项信息是常量池,用来存储编译期间生成的字面量和符号引用。

    在方法区中有一个非常重要的部分就是运行时常量池,它是每一个类或接口的常量池的运行时表示形式,在类和接口被加载到JVM后,  对应的运行时常量池就被创建出来。当然并非Class文件常量池中的内容才能进入运行时常量池,在运行期间也可将新的常量放入运行时常量池中,比如String的intern方法。

    下面我们通过一个例子来看是否是这样的。public class TestClass {

    private Class1 class1 =new Class1();

    private int m;

    public int intc(){

    int count =2;

    return m +1;

    }

    }

    public class Class1 {

    public Class1(){}

    }

    首先通过 javac 命令将TestClass

    展开全文
  • 看Android中View的实现代码,发现很多成员方法里面都用一个临时变量来引用成员变量,不知道这样做有什么意义?下面是我摘录的一段代码:publicclassView{...privatestaticclass...我看Android中View的实现...

    我在看Android中View的实现代码,发现很多成员方法里面都用一个临时的变量来引用成员变量,不知道这样做有什么意义?下面是我摘录的一段代码:publicclassView{...privatestaticclass...

    我在看Android中View的实现代码,发现很多成员方法里面都用一个临时的变量来引用成员变量,不知道这样做有什么意义?下面是我摘录的一段代码:

    public class View {

    ...

    private static class ScrollabilityCache implements Runnable {

    /**

    * Scrollbars are not visible

    */

    public static final int OFF = 0;

    /**

    * Scrollbars are visible

    */

    public static final int ON = 1;

    /**

    * Scrollbars are fading away

    */

    public static final int FADING = 2;

    ...

    public final Interpolator scrollBarInterpolator = new Interpolator(1, 2);

    ...

    public void run() {

    ...

    /**********这里用interpolator保存成员变量scrollBarInterpolator!!!!!!!!!!!!!********/

    Interpolator interpolator = scrollBarInterpolator;

    // Start opaque

    interpolator.setKeyFrame(framesCount++, nextFrame, mOpaque);

    // End transparent

    nextFrame += scrollBarFadeDuration;

    interpolator.setKeyFrame(framesCount, nextFrame, mTransparent);

    state = FADING;

    // Kick off the fade animation

    host.invalidate();

    }

    }

    }

    }

    谢谢您的回复,我想应该也是惯例。

    scrollBarInterpolator被定义成public,所以声明成final.

    如果不这样,其它类对象可能直接引用并修改它。这和这个类的run方法在独立的线程执行应该没有关系。另外,在View这个类里,也看到了其它没有被声明成final的成员变量,在成员方法里也用临时变量引用了,就像示例中一样。

    展开

    展开全文
  • oracle使用临时变量

    2021-05-07 04:22:27
    临时变量使用它的sql语句中有效,变量值不能保留,临时变量也称为替换变量。sql语句中,如果某个变量前面使用了&符号,那么久表示该变量是一个临时变量,执行sql语句时,系统会提示用户为该变量提供一个...
  • c语言变量存储问题函数体中定义的变量通常是栈上,用malloc, calloc, realloc等分配内存的函数分配得到的就是堆上。函数外部定义的变量(全局变量或静态外部变量)和函数内部定义的static变量,其生存期就是...
  • 背景: 目前有一个新的需求,但是这个需求的改动需要对历史数据进行新逻辑的处理 各种想法: 1)通过设定定时任务的方式处理,但是数据要怎么取?... 一开始的想法是,通过设定一个临时变量,按时间...
  • 临时变量
  • 原理:首先需要明白一件事情,临时变量函数调用过程中是被压到程序进程的栈中的,当函数退出时,临时变量出栈,即临时变量已经被销毁,临时变量占用的内存空间没有被清空,但是已经可以被分配给其他变量了,所以...
  • C语言程序开发中,有时为了一行代码不至于过长,或者其他原因,程序员常常会使用一些临时的中间变量,使用临时中间变量的C语言代码,大都可以抽象成类似于下面这样的例子,请看:inti=5;intj=10;intresult=i+j;...
  • 返回局部变量(或临时变量)的地址 返回局部变量 int sum(int a, int b) { int n = a + b; return n; } int main() { int a = 10; int b = 20; int c = sum(a, b); cout << c << endl;//30 ...
  • 如何Bash中合理的设置变量Bash中变量的设置环境变量和自定义变量几个重要的环境变量从键盘获取变量的值定义变量declare变量内容的变更变量内容的删除变量内容的替换变量的默认值替换设置更多的变量替换设置方式...
  • Linux中修改环境变量及生效方法如下:方法一:/etc/profile文件中添加变量【对所有用户生效(永久的)】用vim文件/etc/profile文件中增加变量,该变量将会对Linux下所有用户有效,并且是“永久的”。要让刚才的...
  • 右值引用保存临时变量(函数返回值)的问题 结论: 无论是用右值引用还是普通变量保存返回值,最终函数返回时都是通过eax保存的。 区别在于: 1、普通变量:就直接将eax赋值给普通变量 2、右值引用:就将eax的值...
  • 定义临时变量:{% with i=1 %}{{i}}{% endwith %}定义对临时变量操作的tag templatetags中创建set_val.py内容是from django import templateimport loggingregister = template.Library()class SetVarNode...
  • #先安装panda包(自行安装) import pandas as pd #引用包 ...train = pd.read_csv('D:/MyPytorch_study/nasa-engine-database/CMaps/train_FD001.txt', sep='\s+', header=None, names=col_names) #读取数据存为临时.
  • 问题确实是出强转上,而且也确实会产生一个临时变量。 如何证明产生了临时变量?只需要将 const int &tt 的 const 修饰符去掉,就编译不过了,这时候会报错 Non-const lvalue reference to type 'int' ...
  • 直接多次访问数组索引,或将数组索引的值保存到新变量并使用它来进行后续计算?访问索引if ((shape.vertices[0].x >= fromX && shape.vertices[0].x <= toX) || // left side of shape in screen(shape...
  • 普通的做法就是声明多一个临时变量tmp,进行数据交换过程中的缓存。这样的做法直观,易懂。但是,会增加内存的使用。 var a = 1, b = 2, tmp; tmp = a; a = b; b = tmp; 二、算术运算 通过算术运算过程中的...
  • 保险动车车辆机中险的辆保损失,部变变量保险人保任的险责属于是(。保险的赔要是车辆偿方机动式主。被保舶如部损内发长的延险船时间生全失,保远舶保洋船期保情况按定险投险的下,保险)的需加付(费。保险本险...
  • 原文链接:https://www.cnblogs.com/zhaowei303/articles/4204805.htmlSQL数据库中数据处理时,有时候需要建立临时表,将查询后的结果集放到临时表中,然后针对这个数据进行操作。创建“临时表”(逻辑上的临时表,...
  • SQL数据库中数据处理时,有时候需要建立临时表,将查询后的结果集放到临时表中,然后针对这个数据进行操作。创建“临时表”(逻辑上的临时表,可能不一定是数据库的)的方法有一下几种:1.with tempTableName as方法...
  • 2、强制类型转换(对于普通变量)2.1 改变空间大小2.2 存储结构发生改变3 强制类型转换(指针变量)3.1 指向空间的强制类型转换3.2 指针本身...引用发生空间大小变化3.4 指针变量引用发生存储结构变化4、临时匿名变量...
  • 文章目录 第六章 临时全局变量和IRISTEMP数据库定义临时全局变量的映射IRISTEMP的系统使用 第六章 临时全局变量和IRISTEMP数据库 对于某些操作,可能需要全局变量的功能,而不需要无限期保存数据。例如,可能希望...
  • 局部变量,局部静态变量,全局变量,全局静态变量区别:局部变量: 栈区局部静态变量:静态区全局变量: 静态区的常量区全局静态变量:静态区进行C/C++编程时,需要程序员对内存的了解比较精准。经常需要操作的...
  • sql:临时表和表变量

    2021-02-08 01:07:58
    SQL Server的性能调优中,有一个不可比拟的问题:那就是如何一段需要长时间的代码或被频繁调用的代码中处理临时数据集,表变量临时表是两种选择。临时表:临时对象都以#或##为前缀,临时表是临时对象的一种,...
  • C++中的临时变量

    2021-02-03 15:17:07
    值传递的时候会产生临时变量 类型转换的时候也会产生临时变量 参数为const类型时 产生临时变量的三种情况:一:以By Value的方式传值;二:参数为const的类型。三:类型转换 一:以By Value的方式传值。 我们都...
  • 3、编辑start.bat文件,设置临时环境变量 set path=%path%;C:\Qt\Qt5.14.2\5.14.2\msvc2017\bin 4、写入程序所在路径 start /d “D:\myCpp\QT5Lean\testproj1\src\testsignal\Debug” testsignal.exe 5、保存start....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 319,173
精华内容 127,669
关键字:

临时变量存放在哪里