我试图理解后台声明和分配原始类型的过程。
int i;
i = 3;
对于1),在内存堆栈上,它分配一个空间来存储名为i的int类型值 对于2),它将值3分配给上面保留的空间
那里有内存地址吗? 根据我的印象,内存地址总是与堆上的对象相关联吗?
更新
关于答复:
因此,对于堆栈上的每个变量,它们都被分配了一个内存地址,就像堆上的对象一样。我是对的吗?
但是对于Java,情况并非如此?
答案 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内存的开头然后堆。