【问题标题】:When defining a variable in C for example, where is the memory address for that variable stored?例如,在 C 中定义变量时,该变量的内存地址存储在哪里?
【发布时间】:2012-12-10 11:48:37
【问题描述】:

如果我在 C 中定义一个变量(即 unsigned short int n = 5),该值以二进制形式存储在用户 RAM 中的某处(在这种情况下,它看起来像 0000 0000 0000 0101)。存储该值的位置也有一个二进制地址。 (即值 5 可以存储在 0010 中,这意味着它在 ram 中同时使用 0010 和 0011,因为它使用 2 个字节)。变量 n 的名称表示存储该值的内存地址。该内存地址存储在哪里?这不会占用更多的内存吗?如果确实如此,那么该地址是否也必须具有地址?

【问题讨论】:

  • 非常接近于准确描述C中的指针是什么;一个变量(与所有变量一样有一个地址),它也保存一个地址(它的是一个地址)。

标签: c memory binary computer-science ram


【解决方案1】:

变量的内存地址不直接存储在内存中。它是访问变量的代码的一部分。根据具体情况,它可以是偏移量(与已知位置的距离 - 例如局部变量的堆栈指针,对于全局变量,它可能是程序计数器)或绝对地址(仅适用于全局变量)。

如果您想要一个变量来存储变量的地址,那么是的,您也需要该变量的内存。这种类型的变量称为指针。

【讨论】:

    【解决方案2】:

    这取决于几个因素,例如分配方法(堆栈或静态),如何访问变量,但我们假设这段代码:

    static int n = 5;
    printf("%p\n", &n);
    

    在这种情况下,n 的地址存储在调用printf 的代码段中。如果你反汇编代码,你会发现一条push 指令,在调用printf 之前将地址压入堆栈。被推送的地址是n的地址(它是被推送的两个地址之一,还有格式字符串)。

    正如我上面所说,它并不总是相同的方式。不同的架构和编译标志(例如-fpic)可以改变它。
    此外,如果变量在堆栈上,或者对它的引用不是来自代码,而是来自数据(例如int n=5; int *p = &n;),情况就会发生变化。

    【讨论】:

      猜你喜欢
      • 2010-09-18
      • 2018-02-01
      • 1970-01-01
      • 2019-05-26
      • 2017-03-26
      • 2010-10-02
      • 2019-05-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多