【问题标题】:The "%p" printf parameter"%p" printf 参数
【发布时间】:2017-06-26 13:14:30
【问题描述】:

我有这个代码:

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

void main(){
       printf("%p");
}

这是输出: 0x7ffdd9b973d8

我知道%p 代表指针,当使用它作为例子时

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

void main(){
 int i = 0;
 printf("%p", i);
}

它返回i的指针地址。但我的问题是,当不在 printf 函数中添加任何其他参数时,它会返回什么 printf("%p")

【问题讨论】:

  • printf("%p", i); 不打印i 的地址。你需要printf("%p", (void *) &amp;i);。
  • 我认为这只是内存中的一个随机地址。好吧,不像生成的那样随机,但不能直接预测。基本上是垃圾。
  • @ant 你需要(void *)吗?
  • @cullub:学究式,是的。 printf 需要一个 void * 指针。 [signed/unsigned] char * 指针可以在没有强制转换的情况下使用,因为它保证与void * 具有相同的表示形式。但是int * 可以有不同的表示,这就是为什么它必须转换为void *。
  • @cullub Yes。指针可能有不同的对象表示。

标签: c printf format-specifiers


【解决方案1】:

的行为

printf("%p");

未定义。当您在格式字符串中指定%p 格式时,void *(或char *)类型的相应参数应出现在参数列表中。

【讨论】:

  • 我认为 OP 正在询问如何执行该规则,如果有的话。
  • @Mad Physicist:我没看到。问题似乎是关于印刷垃圾及其来自何处。
  • 这是有道理的,但您的回答并不能真正回答垃圾的来源。在这种情况下,未定义是什么意思?毕竟,OP 正在获得具体的结果。
  • @Mad Physicist:实际实验总会产生某种意义上的具体结果。我没有引用“未定义行为”的标准定义,因为每个人都可能已经厌倦了无数次听到它。
  • @MadPhysicist 见what is undefined behaviour。我正在考虑在链接该链接的次数内获得一个宏键盘
【解决方案2】:

但我的问题是,在 printf 函数中不添加任何其他参数时它会返回什么只是 printf("%p");

任何东西。没有。随机垃圾。可能会崩溃。

如果不研究编译器、CPU、平台、库、执行环境等的特定组合,就无法知道。没有规则要求它以任何特定方式运行。

【讨论】:

    【解决方案3】:

    垃圾。 printf 使用可变长度参数列表。它使用格式字符串来确定您实际传递了多少参数。如果你实际上没有传入任何东西,它仍然会像你一样从内存的基本任意部分读取。结果是未定义/垃圾。

    由于printf 系列函数非常流行,一些编译器将能够通过警告捕获这种情况。如果函数尝试从您无权访问的内存中读取,某些情况下可能会使您的系统崩溃。即使你已经获得了一定的结果,也没有办法知道它下次会如何表现。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-09
      • 2014-04-26
      • 2014-09-12
      • 1970-01-01
      • 1970-01-01
      • 2011-01-23
      相关资源
      最近更新 更多