【问题标题】:Is primitive assigned a memory address?原语是否分配了内存地址?
【发布时间】:2008-11-25 02:35:47
【问题描述】:

我正在尝试了解一个原始类型在后台的声明和赋值过程。

  1. int i;
  2. i = 3;

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

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

更新:

关于回复:

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

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

【问题讨论】:

    标签: java primitive


    【解决方案1】:

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

    add $2, $0, 3
    

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

    【讨论】:

      【解决方案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
      

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            猜你喜欢
            • 2020-07-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-06-23
            • 2018-08-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多