【问题标题】:Printing main() in C在 C 中打印 main()
【发布时间】:2014-07-23 21:58:14
【问题描述】:

所以我得到了这个小代码块。主函数打印主函数。它打印什么?是某种地址吗?

int main() {
   printf( "%d", main ) ;
 }

【问题讨论】:

  • warning: format '%d' expects type 'int', but argument 2 has type 'const char*'
  • main() 返回EXIT_SUCCESSEXIT_FAILURE。定义stdlib.h0 是标准的。但是这里没有调用。
  • 要学究气,为了这是一个有效的 C 程序,它应该 return 0 或其他东西。
  • 自 1999 年以来,main() 在没有 return 语句的情况下返回 0
  • 格式“%d”需要“int”类型的参数,但参数 2 的类型为“int (*)()”

标签: c printf main


【解决方案1】:

是的,函数的名称计算为它的地址。如果没有函数调用运算符(),则不会进行调用。

但这不是有效的代码,%d 不是函数指针的有效格式说明符(并且缺少 return)。不幸的是,打印了一个函数指针is not very simple to get right

【讨论】:

    【解决方案2】:

    它将打印main的地址。就像您尝试打印任何普通函数的地址一样简单。

    【讨论】:

      【解决方案3】:

      编译器会显示错误。

      【讨论】:

      • 它可能会打印地址但可能会抛出错误。
      • 不,它不会抛出错误。我实际上测试了它。编译器会抛出两个警告,但由于隐式转换不会出错。
      • @phyrrus9 是警告错误吗?
      • 不,这是完全无效的代码。函数指针不容易打印出来。
      • @user3328692,警告和错误一样糟糕。实际上,C 标准只有术语“诊断”,即使编译器在这样的诊断之后继续,所有的赌注都没有。
      【解决方案4】:

      这将以十进制格式打印函数 main() 的地址。您应该使用 %x 而不是 %d。当编译器编译程序时,它会创建许多内存段,但所有代码都进入 .text 段,这是一个只读段。所以这个地址来自 .text 段。尝试写到这个地址,你应该得到一个错误。

      【讨论】:

      • 我没有投反对票,但%p 应该比%x 更正确
      • @MohitJain 他们都错了。 %p 用于打印数据指针(指向 C 标准词汇表中的对象的指针)。这样的指针可以转换为void*。函数指针不是指向对象的指针,它不能转换为void*,并且它不应该作为对应于 printf 中的%p 的参数传递,而不是作为对应于%x 的参数传递。
      • @PascalCuoq 谢谢指点。使用 Wall gcc 会给出ISO C forbids conversion of function pointer to object pointer type。所以简而言之,没有办法(也没有实际需要)打印函数指针。尝试打印函数指针看起来 UB。
      【解决方案5】:

      假设一个函数 fn()

      printf("%d",fn());
      

      将其返回值打印为十进制整数。如果返回的不是 int,编译器可能会报错。

      printf("%d",fn);
      

      将其地址打印为 int。编译器可能会抱怨函数指针到 int 的转换。

      打印地址的正确方法是:

      printf("%p",variable);
      

      编辑: 但是,正如 Pascal 和其他人所提到的, %p 仅对指向对象的指针有效,因此没有正确的方法来打印函数的地址。

      【讨论】:

      • %p 用于打印数据指针(指向 C 标准词汇表中的对象的指针)。这样的指针可以转换为void*。函数指针不是指向对象的指针,不能转换为void*,也不应该作为printf中%p对应的参数传递。
      猜你喜欢
      • 1970-01-01
      • 2021-06-11
      • 2018-03-26
      • 1970-01-01
      • 1970-01-01
      • 2011-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多