当前位置:  开发笔记 > 编程语言 > 正文

打印地址时出现意外的值

如何解决《打印地址时出现意外的值》经验,为你挑选了1个好方法。

这是我的计划.输出如下.

#include 
#include 

int main(void) {
    int n = 3, *pt;
    pt = &n;
    printf("\n%d", pt);
    printf("\n%d", &n);
    printf("\n%d", &pt);
    return 0;
}

输出:

-9705676
-9705676
-9705672

但我认为第三个数字应该与前两个相同?请有人解释一下为什么不是这样?



1> P.P...:

这是所有未定义的行为,因为您使用错误的格式说明符来打印指针.

使用%p打印指针扔来void*.

printf("\n%p",(void*) pt);
printf("\n%p",(void*) &n);
printf("\n%p",(void*) &pt);

C标准要求对应于格式规范的参数%p是类型void*.

C11,7.21.6说:

p参数应该是指向void的指针.指针的值以实现定义的方式转换为打印字符序列.

通常,T *(任何对象指针)可以隐式转换为void *没有显式强制转换(例如在赋值中).但是printf()是一个可变函数,并且这里没有发生这样的转换.所以演员阵容是必需的.

但我认为第三个数字应该与前两个相同?

不会.在第三个中,您将打印指针本身的地址.而在前两个,你打印的地址n.

为了说明这一点:

             +------+      
       n --> |      |  
      0x1000 |  3   |  n is stored at address 0x1000
             |      |
             +------+

             +------+      
      pt --> |      |  
      0x2000 |0x1000|  pt stores the address of n. 
             |      |  But the address of pt is different.
             +------+

推荐阅读
大大炮
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有