【问题标题】:Printing a null pointer with printf gives (nil) but printing &ptr gives an address. Why?用 printf 打印空指针会给出 (nil) 但打印 &ptr 会给出地址。为什么?
【发布时间】:2016-10-28 05:08:51
【问题描述】:

如果我这样做:

int *ptr = NULL:

printf("%p", ptr);

我得到 (nil) 打印出来。所以这是打印出指针的地址?其中指向一个空指针地址。

但如果我这样做:

int *ptr = NULL;

printf("%p", &ptr);

我得到一个内存地址。为什么是这样?是因为它给出了实际的 NULL 内存位置吗?这个位置总是改变吗?每当我使用第二段代码时,我都会不断获得不同的内存地址。

【问题讨论】:

  • int ptr = NULL 不是指针。它是一个整数。
  • @RishikeshRaje 对不起!忘了*。谢谢!
  • 当使用%p 打印空指针时,printf() 的哪个变体给出(nil)
  • @JonathanLeffler 你是什么意思哪个变种?
  • 谢谢。那很有意思。不习惯(nil);它不是大多数地方印刷的。例如,在 Mac 上,您会得到 0x0(即使您使用 %12p,尽管它在 12 个空格中是右对齐的)。还有一些平台在你使用 "%s" 并给它一个空指针来工作时不会崩溃……它们很容易打印出 (null) 或类似的东西。

标签: c pointers


【解决方案1】:

指针ptr中存储的NULL0

但是,ptr 是一个变量。它存储在某个内存位置。所以如果你取&ptr,你会得到ptr所在的内存位置。

【讨论】:

  • 所以如果没有&ptr,%p 会打印出ptr 的值?是否只有在 ptr 为空时才这样做?
  • printf("%p", ptr); 打印ptr 中的值。无论ptr 中的值是什么。例如你可以先int a; ptr = &a; 然后printf("%p", ptr)。你会在那里得到一个值。
  • 所以在同样的场景中,如果你做printf("%p", ptr);,那么它会得到一个类似0x7ffdf4d5c054的地址,然后如果你也做printf("%p", &ptr);,它会在它旁边给出一个地址@987654338 @。是不是因为第一个里面有 a 变量的地址,而第二个是指针本身的实际地址?
  • 正确。如果你这样做 printf("%p", &a) 它将与 ptr 相同
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-07
相关资源
最近更新 更多