【问题标题】:What is printed when I write function name in C using printf() function当我使用 printf() 函数在 C 中编写函数名时打印什么
【发布时间】:2015-02-08 19:35:40
【问题描述】:

当我写这段代码时:

#include <stdio.h>

int main()
{
    printf("%p\n",main);
    printf("%d\n",main);
    return 0;
}

我的编译器显示了这个输出:

00401318
4199192

我很想知道实际打印的是什么。我用谷歌搜索了我的问题,但一无所获。 :(

提前致谢。

【问题讨论】:

  • 第一个打印函数的地址,如果你的平台上sizeof(void*)等于sizeof(int),第二个打印函数的地址,但它通常被认为是未定义的行为.
  • @TheBigH,我不知道函数指针这个词。
  • 并非巧合,0x401318 == 4199192。

标签: c function


【解决方案1】:

main 是一个int(*)(void) 类型的函数指针

  1. printf("%p\n", main);

您正在打印该指针的地址,该地址在您的平台上已成功转换为void*。如果sizeof(main) == sizeof(void*) 就好了。

  1. printf("%d\n", main);

这会给你未定义的行为,因为%d 不是一个好的指针类型的格式说明符。

【讨论】:

  • %d 说明符是什么?
  • OP 正在打印指针的 (这是函数的地址),而不是指针的 地址。此外,只有在 OP 的平台上 sizeof(void*) 等于 sizeof(int) 时,才能保证对 printf 的第二次调用正常工作,但它通常被认为是未定义的行为。最后一件事 - 我不是为这个答案投票给你的人,所以请不要四处投票给我自己的随机答案。
  • 它们是相同的值。 %p 将其格式化为十六进制,%d 将其格式化为十进制。 0x401318 == 4199192
  • @robert:这不是真的。例如,如果 OP 在 64 位平台(64GB 内存地址空间)上运行,则 %p 将等同于 %lld(或更准确地说,等同于 %llx)。
  • 投反对票 "%p 应该没问题"。函数指针与void* 指针不兼容。
【解决方案2】:

这不是很好的定义。

您正在使用%p,它需要void * 类型的参数,但实际上您传递给它的是int (*)() 类型的值,即您的(也定义错误的)main() 函数。

您不能将函数指针移植到void *,因此您的代码永远不会正确。

在大多数典型系统上,sizeof (void *) == sizeof main,因此您只需将值解释为 void *,这可能只是函数的地址。

使用格式说明符%d 将函数地址传递给printf() 更糟糕,因为很可能sizeof (int) != sizeof main 然后你会得到未定义的行为。

这不是好代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-03
    • 2022-10-01
    • 2021-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多