有些书籍和网页告诉我有关C程序内存布局的知识。例如堆栈位于比堆高的地址,全局变量的位置低于堆栈。但我发现这不是真的:
D:\ code>输入testlayout.cpp
#include <stdio.h>
int g;
int main()
{
int loc = 0;
printf("%p %p\n", &g, &loc);
}
D:\ code&gt; 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:\代码&GT; testlayout.exe
000000013F2222C0 000000000022FB20
d:\代码&GT;
任何人都可以解释为什么全局变量的地址大于局部变量的地址。
答案 0 :(得分:2)
c(或c ++)程序的内存布局未由c(或c ++)标准定义。你的书是出于无知或者他们实际上说这是典型的内存布局或布局对于特定编译器生成的程序是正确的在特定平台上,该平台不一定与您的相同。由于未定义布局,不同平台上的不同编译器可能会使用他们认为实用的任何内存布局。
你的程序是c ++而不是c,所以如果为c定义了这样的布局,它就不一定适用于你的程序。
答案 1 :(得分:1)
C和C ++标准都没有指定将对象放在内存中的位置。他们绝对没有说明内存片段相对于彼此的位置。 (事实上,有些架构甚至根本不会将代码和数据存储在同一个内存空间中!)
虽然您的书的陈述可能适用于某些操作系统和体系结构,但对所有操作系统和体系结构来说并非如此。现代地址空间随机化可能通过随机放置堆栈,程序和堆地址来进一步混淆图像。