【问题标题】:Local variable in c seems to be near stack memoryc中的局部变量似乎靠近堆栈内存
【发布时间】:2016-10-18 13:04:47
【问题描述】:

我们知道局部变量与 main 函数和所有其他函数都在堆栈内存中。当我打印 main 函数的地址、局部变量的地址和 malloc 的地址时,似乎局部变量更接近到malloc地址而不是主要功能地址。为什么? 代码:

int g;

int main(int argc, char** argv) {
    int l;
    printf("Adress of main fuction: %d\n", main);
    printf("Adress of a global variable(g): %d\n", &g);
    printf("Adress of a local variable(l): %d\n", &l);
    printf("malloc: %d\n", malloc(10));
}

【问题讨论】:

  • 为什么不应该更近一些?还是更进一步?编译器和操作系统可以随心所欲。
  • 不要使用%d 打印地址——这就是%p 的用途。
  • 你能告诉我们这些地址吗?
  • C 的实现根本不需要有栈;事实上,“堆栈”这个词在 C99 的文本中根本没有出现。 (需要支持递归函数调用,但不需要堆栈。)

标签: c memory heap-memory stack-memory


【解决方案1】:

堆栈、代码和数据的确切布局完全由编译器决定。

这是实现定义的行为,因此它可能因编译器而异。

【讨论】:

    【解决方案2】:

    auto 变量不必在使用它们的代码附近的任何地方实例化。鉴于 C 不限制检查数组访问,这是一件好事,否则您可以使用缓冲区溢出来直接修补二进制代码。

    以下是程序通常(尽管并非总是)在(虚拟)内存中的布局方式:

                  +------------------------+ 
    high address  | Command line arguments |   
                  | and environment vars   |  
                  +------------------------+
                  |         stack          |
                  | - - - - - - - - - - -  |
                  |           |            |
                  |           V            |
                  |                        |
                  |           ^            |
                  |           |            |
                  | - - - - - - - - - - -  |
                  |          heap          |
                  +------------------------+
                  |    global and read-    |
                  |       only data        |
                  +------------------------+
                  |     program text       |
      low address |    (machine code)      |
                  +------------------------+   
    

    不同实现的细节有所不同,但总体情况很常见。机器码与数据隔离,全局、只读数据与栈、堆等隔离。

    【讨论】:

    • 单独制作 ASCII 图所花费的时间值得一分。
    【解决方案3】:

    没有。与局部变量和“全局变量”相比,函数驻留在不同的内存中。

    对于特定的进程实例,它们的虚拟地址必须足够不同,以保持不同的段不重叠。

    我认为它足够远来容纳你的堆栈。

    gps@gps-HP-ProBook-4540s:~/temp/weirdtest$ ./weirdtest 
    Adress of main fuction: 4195709
    Adress of a global variable(g): 6295628
    Adress of a local variable(l): 29174716
    malloc: 17440784
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-05
      • 2016-06-23
      • 1970-01-01
      • 2021-10-28
      • 1970-01-01
      相关资源
      最近更新 更多