6

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

  1. int i;
  2. i = 3;

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

那里有内存地址吗?在我的印象中,内存地址总是和堆上的对象相关联的?

更新:

关于回复:

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

但是对于Java来说,不是这样吗?

4

4 回答 4

5

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

add $2, $0, 3

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

于 2008-11-25T03:42:35.237 回答
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
于 2008-11-25T02:38:20.500 回答
0

堆栈缓冲区溢出如何发生?:) 有人必须写一个指向堆栈的指针。

于 2008-11-25T02:45:29.080 回答
0

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

于 2011-01-24T20:18:24.947 回答