2008-11-25 79 views
6

我想了解在后台声明和分配原始类型的过程。是基元分配的内存地址?

  1. int i;
  2. i = 3;

对于1),存储器堆栈,其分配的空间,用于存储名为I 对于2 int类型的值),它的值3分配给上面保存的空间

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

更新:

关于回复:

所以,在堆栈上的每个变量,它们都被分配了一个内存地址,以及就像在堆中的对象。我对么?

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

回答

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 
0

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

5

并不总是涉及地址。编译器可以将变量放入寄存器,如果它发现他们的地址永远不会被程序员使用。所以你不需要访问主内存。例如,在你的代码上面,什么编译器可以生成可能是那样简单

add $2, $0, 3 

把价值3到寄存器2.只要你创建一个指针,并使其指向变量,那么你有一个地址,实际上。然后变量不能再只在一个寄存器中。

0

真正的堆栈是proccess虚拟内存的特殊区域,所以堆栈中的所有东西都有内存地址。由ESP(SP)注册表(x86架构)支持的堆栈头。堆栈地址通常低于内存地址,因为堆栈位置更接近于初始内存的开始然后堆积。