【问题标题】:Print the address or pointer for value in C在 C 中打印值的地址或指针
【发布时间】:2010-11-06 13:23:19
【问题描述】:

我想做一些看起来相当简单的事情。我得到了结果,但问题是,我无法知道结果是否正确。

我正在使用 C 语言,我有两个指针;我想打印指针的内容。我不想取消引用指针来获取指向的值,我只想要指针存储的地址。

我写了以下代码,我需要知道的是它是否正确,如果不正确,我该如何纠正它。

/* item one is a parameter and it comes in as: const void* item1   */
const Emp* emp1 = (const Emp*) item1; 

printf("\n comp1-> emp1 = %p; item1 = %p \n", emp1, item1 );

虽然我发布这个(以及它正确的原因很重要)是我最终需要为一个指向指针的指针执行此操作。那就是:

const Emp** emp1 = (const Emp**) item1; 

【问题讨论】:

  • 你写的是对的,你到底遇到了什么问题?
  • 正如我所描述的,我得到了结果,但无法知道结果是否正确,或者它是否给了我垃圾。 Don 和下面的其他人(以及您自己)确认这些结果是有效的。

标签: c pointers memory-address


【解决方案1】:

在指针中打印地址:

printf("%p",emp1)

取消引用一次并打印第二个地址:

printf("%p",*emp1)

您始终可以使用调试器进行验证,如果您在 linux 上使用ddd 并显示内存,或者只是简单的gdb,您将看到内存地址,以便您可以与指针中的值进行比较。

【讨论】:

    【解决方案2】:

    你所拥有的是正确的。当然,您会看到 emp1 和 item1 具有相同的指针值。

    【讨论】:

    • 如果 item1 的类型是多重继承的一部分和/或 Emp 的祖先,它们将不一样,这取决于编译器如何布置构成 item1 类型的每个类。
    • @Jim:“C”标签另有说明
    • @Jim:Hasturkun 是对的。我在 C 部门工作。我应该把它贴出来。
    【解决方案3】:

    我相信这是最正确的。

    printf("%p", (void *)emp1);
    printf("%p", (void *)*emp1);
    

    printf() 是一个可变参数函数,必须传递正确类型的参数。标准说%p 接受void *

    【讨论】:

    • 我想他们被提升了?不确定,谁能解释一下?
    • 经过一番研究,不,它们不会自动提升。确实需要转换为void *
    【解决方案4】:

    既然您似乎已经解决了基本的指针地址显示问题,下面是您检查双指针地址的方法:

    char **a;
    char *b;
    char c = 'H';
    
    b = &c;
    a = &b;
    

    您可以通过以下方式访问双指针a 的地址:

    printf("a points at this memory location: %p", a);
    printf("which points at this other memory location: %p", *a);
    

    【讨论】:

    • printf("which contains this value: %c\n" **a); 只是想添加那个^.^.
    【解决方案5】:
    char c = 'A';
    printf("ptr: %p,\tvalue: %c,\tand also address: %zu", &c, c, &c);
    

    结果:

    ptr: 0x7ffc48e5105f,    value: A,    and also address: 140721531457631
    

    【讨论】:

      【解决方案6】:

      我一直担任这个职位,尤其是在新硬件方面。我建议你自己编写一个小十六进制转储例程。您将能够看到一起显示的数据和它们所在的地址。这是一种很好的做法,可以建立信心。

      【讨论】:

      • 以听起来无知为代价——你能详细说明一下如何编写这样的例程吗?
      • 这个答案可能更适合作为评论?
      猜你喜欢
      • 2012-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-07
      • 1970-01-01
      • 1970-01-01
      • 2020-06-07
      • 1970-01-01
      相关资源
      最近更新 更多