如何使用 C/C++ 访问内存的内容?
How can I access the content of a memory using C/C++?
我想知道RAM的最高地址。假设我有 RAM 4GB(在 32 位计算机中(和 16GB(在 64 位计算机中(,但它也与显示器共享,这意味着并非所有 RAM 都用于应用程序。我想知道它仍然未占用的部分 RAM 的地址是什么,以及特定内存地址内的数据类型是什么?这里似乎有很多问题。这显然与指针和内存分配有关。但实际上我想知道的是:
在 C/C++ 中要知道的命令是什么?假设我想访问内存地址"4294967295d"或"FFFF FFFFh"或任何其他地址的内容。
我的编译器在Windows和Linux下都是gcc。
内存地址"并不存在。在现代机器上,这将使用受保护的内存来完成,这意味着地址本身并不绑定到物理内存库,而是绑定到表示内存并映射到物理内存的页面。
如果进程尝试访问尚未专门分配的内存,则它将触发页面错误并终止。你被框住了。这与较旧的操作系统不同,在旧操作系统中,您只需在内存中四处寻找并查看其中的内容,甚至可以自由修改它。
从技术上讲,映射表中的地址可以是内核希望的任何地址,如 ASLR 所示。
自 32 位机器和保护模式操作系统在 1990 年代后期接管以来,情况几乎就是如此。
在标准C++中无法访问任意特定内存。您可以创建对象,并且可以通过std::malloc
(几乎不需要使用std::malloc
(或运算符new获取对象的内存,但是您无法控制分配来自的内存地址。这些完全由语言实现控制。
从语法上讲,从技术上讲,您可以通过重新解释整数值(表示某个内存地址(来尝试访问任意内存地址。一个整数值是否表示预期的内存地址不能由语言保证,完全取决于语言实现。这在不使用虚拟内存的嵌入式系统上通常很有用。
在现代多任务操作系统上,例如您在问题中提到的那些操作系统,进程看到的内存不是 RAM 中的物理内存,而是操作系统映射到物理内存的虚拟内存。尝试访问尚未由操作系统映射或已映射有限制的虚拟内存通常会导致操作系统终止进程,以防止恶意进程损坏数据。
如果访问程序进程具有足够的权限,则操作系统可以提供访问物理内存(或另一个进程的虚拟内存(的接口。这可能需要对操作系统进行特殊配置,因为此类接口通常被视为安全风险。
假设我想访问内存地址"4294967295d"或"FFFF FFFFh"的内容
在问这样的问题时,您应该首先考虑:您是尝试访问物理地址还是虚拟地址?此进程的虚拟地址还是其他进程?为什么这个特定的地址会包含相关内容?你怎么知道?这些知识可靠吗?您是否有权访问该内存?
我想知道 x 实际存储在哪里?
变量存储在语言实现选择存储它的位置。知道代表地址的数字几乎是有用的。
考虑一个类比:去沙滩,躺在沙滩上看得更近,然后选择一粒沙子。问一个问题:这粒沙子的地址是什么,即这粒沙子的左边有多少粒沙子?肯定有答案...但是你会用这些知识做什么呢?如果你第二天来到海滩,沙粒已经移动,地址不再相同。同样,你会怎么做,知道存储某些对象的内存地址的数字表示
?也就是说,这实际上是可能的。只需将指针插入字符流(如std::cout
(,地址将以文本表示形式打印。除非它是指向字符的指针,否则会以不同的方式处理。
- C++尝试深度复制唯一指针时出现内存访问冲突
- 如何使用 MPI 的远程内存访问 (RMA) 功能并行化数据聚合?
- CRTP - 危险的内存访问?
- C++ Python 的扩展 - 安全内存访问和内存布局
- 在Visual Studio中查找非法内存访问
- C++内存访问违反内存大块
- 数组中未映射的内存访问从python传递到c++
- 使用加速进程间创建消息队列 - 内存访问冲突
- C 指针转换会导致内存访问冲突
- 为什么代码会抛出非法内存访问错误
- 多线程环境中C++内存访问
- CUDA 中的递归返回非法内存访问
- 为什么创建进程 API 调用会导致内存访问冲突?
- 在 C++ 中遍历链表比在具有类似内存访问的 Go 中慢
- 确定打开进程的内存访问位置
- 存在内存访问异常,但我不确定我的代码中出了什么问题
- 指向结构的指针的 2D 数组.内存访问问题
- GPU 内存访问和使用 (CUDA)
- 在实时程序中是动态内存访问有害的
- 随机 mmaped 内存访问比堆数据访问慢 16%