C++ 指针显示不可能的内存位置
Posted
技术标签:
【中文标题】C++ 指针显示不可能的内存位置【英文标题】:C++ pointer showing impossible memory location 【发布时间】:2020-06-09 18:16:39 【问题描述】:我创建了一个 C++ 变量并打印了它的地址,结果发现它非常大:0x7ffdf584da2c。 我的代码如下:
#include <iostream>
using namespace std;
int main()
int var = 10;
cout << "value: " << var << " address: " << &var << endl;
return 0;
value: 10 address: 0x7ffec6f111c4
这种类型的十六进制内存地址 (0x7ffdf584da2c) 看起来不可能,因为它的十进制是 (140728722577964),这对于我的笔记本电脑来说相当大。 我有一台装有 Windows 10 和 Ubuntu 的双启动笔记本电脑,内存大约 500 GB。代码是用 Ubuntu 编写的。
【问题讨论】:
这可能对你有帮助:en.wikipedia.org/wiki/Virtual_address_space en.wikipedia.org/wiki/Virtual_memory 还有这个:https://en.wikipedia.org/wiki/Address_space_layout_randomization#Microsoft_Windows @drescherjm 你比我快 4 秒! DOS、CP/M等时代;您从分配中返回的地址是物理地址。超过 2-3 年的情况并非如此。具有现代操作系统和虚拟内存。这些天来,操作系统会给你一个(出于所有意图和目的)随机的地址。您可以使用它来访问您分配的内存,但它不会告诉您关于您正在运行的机器的物理内存布局的任何内容。 【参考方案1】:没关系。
2020 年的计算机非常复杂。您的进程会获得一个virtual address space,其最大“插槽”几乎肯定会超过您系统(和页面文件)上实际 RAM 的大小。
【讨论】:
非常感谢@Asteroid With Wings。 Jesper 的评论也很有见地:)【参考方案2】:您会看到从内存顶部(不是实际内存,而是操作系统处理的内存)到底部的堆栈。所以通常情况下,如果从一个受操作系统和架构位(32、64、...)限制的高值开始。
【讨论】:
这个答案要么误用了“堆栈”一词,需要改写,要么是错误的,需要更正。 @user4581301 我看不出这个答案有什么问题。 C 和 C++ 中的局部变量通常分配在堆栈上,堆栈指针通常从高值开始,随着分配的更多而下降。这些都不能保证,但它通常是这样工作的。以上是关于C++ 指针显示不可能的内存位置的主要内容,如果未能解决你的问题,请参考以下文章