我试图了解在后台声明和分配原始类型的过程。
int i;
i = 3;
对于 1),在内存堆栈上,它分配一个空间来存储一个名为 i 的 int 类型值 对于 2),它将值 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 架构)持有的堆栈头。堆栈地址通常低于内存地址,因为堆栈位于更靠近进程虚拟内存的开头然后是堆。