精华内容
下载资源
问答
  • 局部变量和全局变量讨论函数的形参变量时曾经提到,形参变量只被调用期间才分配内存单元,调用结束立即释放。这一点表明形参变量只有函数内才是有效的,离开该函数就不能再使用了。这种变量有效性的范围称变量...
  • 我们先看一下全局变量在反汇编中是怎么体现的,如示例示例代码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

    举报/反馈

    展开全文
  • 我知道变量名和变量类型是保存在栈中的局部变量表中,可是局部变量表结构并没有字面量成员,那a的值1是存放在哪里? 反编译后的字节码指令是: ```java 0: iconst_1 1: istore_2 ``` 第一条指令是将常量1压...
  • 刚开始学习Java的时候,就了解了Java基础中的变量,虽然知道这个以后会经常用到,但没想到了基本语法这里,竟然又冒出来了成员变量和局部变量。变来变去太容易让人搞晕了,今天我们就挑拣出来梳理一下!
  • 三人行,必有我师.感慨那个高中生,程序写的真好啊.(口水...) ...1.静态局部变量:  存放在静态存储区. 2.地址确定时期:  在编译时确定. 转载于:https://www.cnblogs.com/dsdr/p/6083533.html...

    三人行,必有我师.感慨那个高中生,程序写的真好啊.(口水...)

    1.静态局部变量:

      存放在静态存储区.

    2.地址确定时期:

      在编译时确定.

     

    转载于:https://www.cnblogs.com/dsdr/p/6083533.html

    展开全文
  • 数据存储的方式有以下几种:1)寄存器,寄存器是CPU内部用来存放数据的一些小型存储区域。是最快的存储区域,数量有限,由编译器...局部变量,对象的引用等都存放在这里。3)堆内存,位于RAM。与栈内存不同的是,编译...

    数据存储的方式有以下几种:

    1)寄存器,寄存器是CPU内部用来存放数据的一些小型存储区域。是最快的存储区域,数量有限,由编译器根据需求分配。

    2)栈内存,位于RAM,通过堆栈指针上下移动,创建或释放内存,这是一种快速有效的分配存储方法,存储速度仅次于寄存器。所有要求存放在此的数据大小和生命周期都是确定,否则无法移动指针。局部变量,对象的引用等都存放在这里。

    3)堆内存,位于RAM。与栈内存不同的是,编译器不需要知道存储区域的大小和有效时间。通过new关键字创建的对象都存放到这里。

    4)静态存储 ,存储的位置是固定的,但是java对象本身并没有存储到这块区域

    5)常量存储 ,用于存储在编译时期就已经确定的数据。包括字符串常量和基本类型常量,例如:String name=“张三”,或是 public static int RES_CODE=200

    6)非RAM存储区 。硬盘等永久存储空间,数据存储在程序之外,不受程序的控制。比如说存放到磁盘上的数据,或是一些“流对象”(流类型数据),对象转化成字节流,通常被发送给另一台机器。

    需要注意的几点:

    1)栈中的数据大小和生命周期都是确定的,而堆中的数据大小和生命周期则是不确定的

    2)栈内存中的数据是可以共享的,常量存储的数据也是可以共享的,堆则不可以。换句话说,对于equal相等的字符串,常量存储区域只有一份,而堆中则允许有多份。

    3)成员变量存储在其所属的对象里面,也就说对象如果是引用存放在栈中,那么对象的成员变量自然也在栈中,如果说对象是new出来的,对象存储在堆中,那么对象的成员变量也在堆中。

    栈内存中数据共享案例:

    String s1 = "qqqqqqqq";

    String s2 = "qqqqqqqq";

    System.out.print(s1==s2);//结果为true

    展开全文
  • java中成员变量和局部变量的存储位置? 位置 成员变量: 位置:定义类中,方法外部(类中方法外) 局部变量: 位置:定义方法体中(方法体{}中、形参、代码块{}中) 结论(jvm) 成员变量...

    在java中成员变量和局部变量的存储位置?

    位置

    • 成员变量:

    位置:定义在类中,在方法外部(类中方法外)

    • 局部变量:

     位置:定义在方法体中(方法体{}中、形参、代码块{}中)

     

     

    结论(jvm)

    成员变量存储在堆中(堆内存的对象中)

    局部变量存储在栈中(作用的范围结束,变量空间会自动释放。)

     

     

    展开全文
  • 1、栈区(stack)— 由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与...
  • 一、实例变量 也叫成员变量、全局变量。...对象的引用存放在方法区,如果用关键字 new 为引用类型的静态变量分配对象,该对象在堆中的地址也会存放在方法区。!但是对象本身仍在堆内存中。 三、局部变量 定义在方法
  • 文章目录静态变量、实例变量、局部变量在JVM中存放的位置 静态变量、实例变量、局部变量在JVM中存放的位置 总结一下这三种变量JVM中存放的位置,首先看一段代码: public class StaticObjTest { static class ...
  • C语言中局部变量和全局变量变量的存储类别(static,extern,auto,register) 1----局部变量和全局变量 讨论函数的形参变量时曾经提到,形参变量只被调用期间才分配内存单元,调用结束立即释放。这一点表明形参变量...
  • 局部变量

    2021-03-08 08:55:11
    局部变量表也称之为局部...由于局部变量表是栈帧中的一个部分,栈帧是线程的栈上,是线程的私有数据,因此不存在数据安全问题3.局部变量表的容量大小是编译期就确定下来的,并保存方法的Code属性的maximum lo...
  • Java中对象的存储位置 String aa = new String(); new创建的对象存储在堆内存中;...局部变量存放在栈内存中 4.Java中全局变量和Static常量的存储位置 存放在全局数据区内存中 5.java中static修饰的成员变量及参数存...
  • lua中全局变量,局部变量,非局部变量分别放在什么容器中,他们的快慢顺序是什么,跪求大神
  • 成员变量是 定义一个类的变量:类中方法外局部变量是定义一个方法内的变量:方法中成员变量分为:静态属性:随类的存在存在,是类加载的初始化非静态属性:随实例的属性存在存在局部变量局部变量不能...
  • 普通局部变量 存在栈区 不初始化内容随机 只定义的复合语句中有效 复合语句结束变量空间释放 普通全局变量 存在全局区 不初始化内容为0 整个进程结束空间释放 能被当前源文件或其他源文件使用,其他源文件使用时...
  • 8 #a3 既是inner局部变量,又是外层outer局部变量 print(a) #a3 8,inner的局部作用域中找到了a3 inner() #inner()函数结束,a3作为外层变量(outer局部变量)被保留成为a2 print(a) #a2 8,outer局部作用域中找到...
  • 对于有些编译器而言,同一个函数内可以定义多个同名的局部变量,比如两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就那个循环体内。2、如何引用一个已经定义过的全局变量?答:extern可以用...
  • C语言使用static中声明局部变量的用法及作用源码 C语言使用static中声明局部变量的用法及作用源码 C语言使用static中声明局部变量的用法及作用源码 C语言使用static中声明局部变量的用法及作用源码 C语言使用...
  • 今天课课家笔者为大家详细介绍局部变量和全局变量的概念和作用。函数的参数和返回值中我们认识到形参变量要等到函数被调用时才分配内存,调用结束后立即释放内存。这说明形参变量只能函数内部使用,离开该函数就...
  • 对于有些编译器而言,同一个函数内可以定义多个同名的局部变量,比如两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就那个循环体内。 2、如何引用一个已经定义过的全局变量...
  • java SE学习笔记——局部变量和成员变量内存中的存放 本文记录了关于变量和内存使用的一些笔记,主要有局部变量和成员变量的区别,内存中的存放,以及Java中基本类型和引用类型的变量的区别,以及其内存中的...
  • 局部变量,线程私有 基本数据类型,参数和参数值Java虚拟机栈中存放的。 引用数据类型,参数Java虚拟机栈中存放的,参数值是对象实例,堆中存放的。 顺便解释下,多线程环境下为什么会产生数据安全问题? ...
  • 换言之,一个函数内部定义的变量是内部变量,它只本函数范围内有效,也就是说只有本函数内才能使用它们,此函数以外时不能使用这些变量的,它们称为局部变量。 全局变量 定义:函数外定义的变量是外部变量...
  • 1.形参与实参C语言函数的参数会出现两个地方,分别是函数定义处和函数调用处,这两个地方的参数是有区别的。1.1形参(形式参数)函数定义中出现的参数可以看做是一个占位符,它没有数据,只能等到函数被调用时接收...
  • 栈区:右边一起自动分配和释放,存放函数的参数值、局部变量值等。其操作方式类似于数据结构中的栈。 堆区:一般由程序员分配和释放,若程序员不释放,程序结束时可能由操作系统收回。注意它与数据结构中的堆时两回...
  • 原文链接:c语言局部变量 静态局部变量 全局变量与静态全局变量 - L的存在 - 博客园 https://www.cnblogs.com/lanjianhappy/p/6035433.html 基本概念: 作用域:起作用的区域,也就是可以工作的范围。 代码块:...
  • 静态局部变量和动态局部变量区别

    千次阅读 2020-05-13 10:03:05
    静态局部变量和动态局部变量区别: 1.静态局部变量属于静态存储类别,静态存储区分配存储单元,整个...4.静态局部变量在函数调用结束后仍然存在,但其他函数不能引用它。 如果用static修饰全局变量,那么该全局变

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 513,614
精华内容 205,445
关键字:

局部变量存在哪里