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

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

  1. int i;
  2. i = 3;

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

那里有记忆地址吗? 从我的印象来看,内存地址总是与堆上的对象相关联?

更新:

关于答复:

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

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

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

 add $2, $0, 3 

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

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

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

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