Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 原语被分配了内存地址吗?_Java_Primitive - Fatal编程技术网

Java 原语被分配了内存地址吗?

Java 原语被分配了内存地址吗?,java,primitive,Java,Primitive,我试图理解在后台声明和分配原语类型的过程 inti i=3 对于1),它在内存堆栈上分配一个空间,用于存储名为i的int类型值 对于2),它将值3指定给上面保留的空间 那里有内存地址吗? 根据我的印象,内存地址总是与堆上的对象相关联 更新: 关于答复: 因此,对于堆栈上的每个变量,它们都被分配了一个内存地址,就像堆上的对象一样。我说得对吗 但是,对于java,情况不是这样的, 假设你在谈论C或C++(我不能告诉),是的。您可以这样访问地址: int i = 3; int *k = &i

我试图理解在后台声明和分配原语类型的过程

  • inti
  • i=3
  • 对于1),它在内存堆栈上分配一个空间,用于存储名为i的int类型值 对于2),它将值3指定给上面保留的空间

    那里有内存地址吗? 根据我的印象,内存地址总是与堆上的对象相关联

    更新:

    关于答复:

    因此,对于堆栈上的每个变量,它们都被分配了一个内存地址,就像堆上的对象一样。我说得对吗


    但是,对于java,情况不是这样的,

    假设你在谈论C或C++(我不能告诉),是的。您可以这样访问地址:

    int i = 3;
    
    int *k = &i; // k now is a pointer to i
    
    *k = 4; // assigns the value k points to (i) to 4, i is now 4
    

    堆栈缓冲区溢出是如何发生的?:)一定有人在向堆栈指针写入数据。

    并不总是涉及地址。如果编译器发现程序员从未使用过变量的地址,则可以将变量放入寄存器。因此,您不需要访问主内存。例如,在上面的代码中,编译器可以生成

    add $2, $0, 3
    

    将值3放入寄存器2中。一旦你创建了一个指针并使它指向那个变量,那么实际上你就有了一个地址。然后变量就不能再只在寄存器中了。

    实际上堆栈是进程虚拟内存的特殊区域,所以堆栈中的所有内容都有内存地址。由ESP(SP)注册表(x86体系结构)持有的堆栈头。堆栈地址通常低于内存地址,因为堆栈的位置更靠近进程虚拟内存的起点,然后是堆