【问题标题】:Value of Pointer in CC中指针的值
【发布时间】:2016-08-25 10:00:48
【问题描述】:

我已经开始学习 C(所以,你知道.. 指针)。

我有这个代码:

#include <stdio.h>
#include <string.h>

int main (int argc, char* argv[])
{
    char c = 'c';
    char* cptr = &c;

    printf("c = %c\n", c);
    printf("*cptr = %c\n", *cptr);  
    printf("c address = %p\n", &c);  
}

我的输出是:

c = c
*cptr = c
c address = 0x7fff0217096f

当我将上面的十六进制转换为十进制时,我得到:140720994002157

我的问题:

1) 这个十进制值是否代表内存地址?是不是太大了?

2) 如何将指针的值(即c 变量的地址)打印为十进制?

【问题讨论】:

标签: c pointers memory-address


【解决方案1】:

[地址]是不是太大了?

这是一个虚拟地址,意思是它的数值不一定代表物理内存中字节的序号。此外,不同的进程可能会将不同的数据保存在同一个虚拟地址,因为每个进程都有自己的地址空间。

如何以整数格式打印指针的值?

使用uintptr_t将指针表示为整数值,然后使用PRIuPTR宏打印:

#include <stdio.h>
#include <inttypes.h>

int main(void) {
    char c = 'x';
    char *p = &c;
    uintptr_t x = (uintptr_t)p;
    printf("Pointer as decimal: %"PRIuPTR"\n", x);
    return 0;
}

Demo.

【讨论】:

  • 谢谢。 +1 用于使用适当的链接和演示。不过关于这个This is a virtual address, meaning that its numerical value does not necessarily represent the sequential number of the byte in physical memory.,我很想问我如何打印物理内存中字节的序号?
  • @padawanTony 你不能,从用户无法访问的虚拟内存映射到物理内存。
  • @padawanTony 这是你的程序隐藏的东西,通过操作系统和运行它的硬件的组合,所以没有独立于操作系统的方法来获取特定地址的映射到物理地址。物理地址在操作系统虚拟内存管理器的上下文之外也是没有意义的,因为页面(分配块)没有特定的顺序。
  • @padawanTony 你不能。知道这些信息没有实际用途,因此操作系统没有提供任何简单的方法来访问它。此外,在大多数现代机器上,物理内存也不连续。
【解决方案2】:

1)。您应该将地址打印为printf("c address = %p\n", &amp;c);。现在您尝试打印存储指针变量本身的地址,这可能没有多大意义。

话虽如此,假设 64 位地址,它可能仍然是有效地址。

2)。您必须安全地将其转换为整数,保证足够大以包含指针地址:

#include <inttypes.h>

printf("c address = %" PRIuPTR "\n", (uintptr_t)&c);

【讨论】:

  • 1) 这正是我正在做的 2) 是的,这会产生正确的结果(即 140723639717279)但 140723639717279 等于大约 1750 GB,对吗?我当然没有那么多记忆!怎么回事?
  • @padawanTony 如上所述,它是virtual memory,不是真实的物理地址。 x86_64 实现可能使用来自两端的canonical address
  • @Luu 但是如果我有足够的 RAM 为什么它会使用虚拟地址?
  • @padawanTony 保护进程不被其他人搞砸。这是在多线程环境中,而不是在 DOS 或嵌入式系统中,您一次只运行一个程序
  • 我明白了。谢谢你。您是否有一个很好的参考来阅读您刚才提到的内容?
猜你喜欢
  • 1970-01-01
  • 2018-09-17
  • 2015-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-27
相关资源
最近更新 更多