c++ - 如何知道C和C++中数据和代码的虚拟地址?

标签 c++ c linux architecture operating-system

  1. 如何获取程序中数据和代码的虚拟地址?

    有人可能会说使用%u%p或其他东西。

    printf("%u", &data);
    printf("%p", &data);
    

    我总是很困惑;哪一个给出正确的地址?两者都给出地址,但有什么区别?

  2. 我们有什么办法可以知道给定的虚拟地址属于内存的哪一部分吗?我们能识别出它是堆栈地址还是堆地址还是其他地址吗?

最佳答案

对于 (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/

相关文章:

c++ - Push_back 不起作用

linux - Bash - 仅提取 tarball 中的第一个文件

c++ - wxWidgets 交叉编译 - 错误 : size of array ‘_GStaticAssertCompileTimeAssertion_0’ is negative

c - 在 C 中使用 LinkedList 共享内存

只能在 makefile 中使用一个目标文件

c - 生成/输出时钟脉冲(C代码)

c - typedef __u32 __bitwise __be32 在 linux 中的意思

c++ - Visual Studio 发布 - 查看 asm 一行

c++ - 在 C++ 中访问传递的结构数组

c++ - std::string 数组元素访问