如何获取程序中数据和代码的虚拟地址?
有人可能会说使用
%u
或%p
或其他东西。printf("%u", &data); printf("%p", &data);
我总是很困惑;哪一个给出正确的地址?两者都给出地址,但有什么区别?
- 我们有什么办法可以知道给定的虚拟地址属于内存的哪一部分吗?我们能识别出它是堆栈地址还是堆地址还是其他地址吗?
最佳答案
对于 (1) 仅 printf("%p", &data)
可用于打印指针地址,尽管您必须编写(void*)&data
(C 标准引用 C11,7.21.6.1p8),printf("%u", &data)
的行为未定义 作为格式说明符对于指针类型无效。但请注意,您看到的地址很可能与物理地址没有任何对应关系;许多操作系统和运行时在物理地址和您看到的指针值之间放置一两个抽象级别。
对于 (2),printf
调用在 C++ 中也有效。
对于 (3),C 和 C++ 标准(除了后者中的几个标准库函数)都没有堆栈或堆的概念>,所以,不,没有可移植的方式来判断。
关于c++ - 如何知道C和C++中数据和代码的虚拟地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37116811/