原始分配了一个内存地址?

时间:2008-11-25 02:35:48

标签: java primitive

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

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

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

    更新

    关于答复:

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

    但是对于Java,情况并非如此?

4 个答案:

答案 0 :(得分:5)

并非总是涉及地址。如果编译器发现它们的地址从未被程序员占用,则编译器可以将变量放入寄存器中。所以你不需要任何访问主内存的权限。例如,在上面的代码中,编译器可以生成的内容可以像

一样简单
add $2, $0, 3

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

答案 1 :(得分:1)

假设你在谈论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

答案 2 :(得分:0)

堆栈缓冲区溢出怎么办? :)某人必须写入指向堆栈的指针。

答案 3 :(得分:0)

真正的堆栈是进程虚拟内存的特殊区域,因此堆栈中的所有内容都有内存地址。由ESP(SP)注册表(x86架构)掌握的堆栈主管。堆栈地址通常低于内存地址,因为堆栈位于更靠近proccess vitrual内存的开头然后堆。