32位进程的虚拟内存布局 我希望能更好地理解32位Windows C++应用程序的虚拟地址空间。我在互联网上的某个地方找到了表示它的图片()。这或多或少是正确的吗? 我创建了一些依赖于静态库和DLL的sample.exe应用程序,并打印变量和函数的地址(都在表中)。我看到了我的结果和这张图片之间的一些差异: 1.有固定的0x00400000地址,程序映像部分应该从这里开始。然而,我看到堆上的变量的地址是0041A168。它们不应该小于0x00400000或大于所有程序映像地址吗? 2.我打印std::abs(double)的地址,它位于程序图像部分。这是否意味着它在某个静态库中? 3.我打印getchar和fopen的地址。这是否意味着它们在DLL库中

32位进程的虚拟内存布局 我希望能更好地理解32位Windows C++应用程序的虚拟地址空间。我在互联网上的某个地方找到了表示它的图片()。这或多或少是正确的吗? 我创建了一些依赖于静态库和DLL的sample.exe应用程序,并打印变量和函数的地址(都在表中)。我看到了我的结果和这张图片之间的一些差异: 1.有固定的0x00400000地址,程序映像部分应该从这里开始。然而,我看到堆上的变量的地址是0041A168。它们不应该小于0x00400000或大于所有程序映像地址吗? 2.我打印std::abs(double)的地址,它位于程序图像部分。这是否意味着它在某个静态库中? 3.我打印getchar和fopen的地址。这是否意味着它们在DLL库中,c++,windows,visual-studio,virtual-memory,C++,Windows,Visual Studio,Virtual Memory,您的图表是一个教学工具,不能反映真实世界的实现。您唯一可以信赖的是,一些地址范围将专用于用户空间,另一个地址范围将专用于系统空间 您可以在一定程度上依赖于标记为“无访问权限”的低范围页面。但是,这通常可以被用户覆盖。0x00400000不再正确。现代windows将布局随机化,试图使恶意软件的实施更加困难。该图中的具体数字仅用于说明。实际数字可能会有所不同。这一形象具有极大的误导性。如果您找到0041A168,那么不要假设它存储在堆上,静态数据更有可能。考虑使用SysStudioS的VMMAP工

您的图表是一个教学工具,不能反映真实世界的实现。您唯一可以信赖的是,一些地址范围将专用于用户空间,另一个地址范围将专用于系统空间


您可以在一定程度上依赖于标记为“无访问权限”的低范围页面。但是,这通常可以被用户覆盖。

0x00400000
不再正确。现代windows将布局随机化,试图使恶意软件的实施更加困难。该图中的具体数字仅用于说明。实际数字可能会有所不同。这一形象具有极大的误导性。如果您找到0041A168,那么不要假设它存储在堆上,静态数据更有可能。考虑使用SysStudioS的VMMAP工具,它提供与您的程序相关的精确信息。“Windows Internals”一书告诉你你想知道的关于内存的一切。我用new运算符创建了这个变量,所以它怎么能不存储在堆上?@user7242858如果你在堆上创建了它,那么它就在堆上了。但是,如果您只是偶然发现了数字
0041A168
,则无法保证该数字始终是堆中的地址。(此外,堆不需要放置在特定位置,也不需要沿特定方向增长,甚至不需要占用连续内存。该图从实际情况来看非常简单。)