【问题标题】:Memory layout of c program, about the location of local variable and global variblec程序的内存布局,关于局部变量和全局变量的位置
【发布时间】:2015-09-02 07:11:02
【问题描述】:

一些书籍和网页告诉我有关 C 程序的内存布局的知识。比如栈的地址比堆高,全局变量的地址比栈低。但我发现这不是真的:

D:\code>输入 testlayout.cpp

#include <stdio.h>

int g;


int main()
{
    int loc = 0;
    printf("%p %p\n", &g, &loc);
}

D:\code>cl testlayout.cpp

Microsoft (R) C/C++ Optimizing Compiler Version 17.00.61030 for x64
Copyright (C) Microsoft Corporation.  All rights reserved.

testlayout.cpp
Microsoft (R) Incremental Linker Version 11.00.61030.0
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:testlayout.exe
testlayout.obj

D:\code>testlayout.exe

000000013F2222C0 000000000022FB20

D:\代码>

谁能解释一下为什么全局变量的地址比局部变量的地址大。

【问题讨论】:

  • 也许因为,这就是编译器映射不同段的方式。
  • 因为这是您的系统决定放置东西的地方。没有真正的理由以一种或另一种方式拥有事物 - 除了自定义之外,堆栈通常位于虚拟内存中的高地址。但是你也可以把栈放在低地址,把数据变量放在高地址。
  • @Lundin,我不认为他们是同一个问题。
  • @SouravGhosh 我正要说同样的话,但是 SS 和 DS 段在 x86-64 架构中重叠(即没有按原样使用分段),请阅读here

标签: c++ c stack


【解决方案1】:

c(或c++)程序的内存布局不是由c(或c++)标准定义的。你的书是出于无知,或者他们实际上已经说过这是一个典型内存布局,或者一个布局对于特定编译器生成的程序是正确的em>一个特定的平台,不一定与您的平台相同。由于没有定义布局,不同平台上的不同编译器可能会使用他们认为实用的任何内存布局。

你的程序是 c++ 而不是 c,所以如果为 c 定义了这样的布局,它不一定适用于你的程序。

【讨论】:

  • 你是对的,它没有定义。即使我把.cpp改成.c,结果也是一样的。
【解决方案2】:

C 和 C++ 标准都没有指定对象在内存中的放置位置。他们绝对没有说明内存段相对于彼此的位置。 (事实上​​,有些架构甚至根本不将它们的代码和数据存储在同一个内存空间中!)

虽然您书中的陈述可能适用于某些操作系统和体系结构,但并非适用于所有操作系统和架构。现代地址空间随机化可能会通过随机放置堆栈、程序和堆地址来进一步混淆画面。

【讨论】:

    猜你喜欢
    • 2012-08-24
    • 1970-01-01
    • 2012-08-12
    • 1970-01-01
    • 2022-08-02
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 2019-04-04
    相关资源
    最近更新 更多