使用printf()函数在C中编写函数名时打印的是什么
当我编写此代码时:使用printf()函数在C中编写函数名时打印的是什么,c,function,C,Function,当我编写此代码时: #include <stdio.h> int main() { printf("%p\n",main); printf("%d\n",main); return 0; } 我很想知道实际印刷的是什么。我用谷歌搜索了我的问题,但什么也没找到( 提前感谢。main是类型为int(*)(void) printf(“%p\n”,main); 您正在打印该指针的地址,该指针在您的平台上已成功转换为void*。如果sizeof(main)==siz
#include <stdio.h>
int main()
{
printf("%p\n",main);
printf("%d\n",main);
return 0;
}
我很想知道实际印刷的是什么。我用谷歌搜索了我的问题,但什么也没找到(
提前感谢。main
是类型为int(*)(void)
printf(“%p\n”,main);
void*
。如果sizeof(main)==sizeof(void*)
,则这将很好
printf(“%d\n”,main);
这将给您提供未定义的行为,因为
%d
不是指针类型的良好格式说明符。这不是定义良好的
您使用的是%p
,它需要一个类型为void*
的参数,但实际上您是在向它传递一个类型为int(*)(
)的值,即(定义也很糟糕的)main()
函数
您无法将函数指针转换为可移植的void*
,因此您的代码永远不会正确
在大多数典型的系统上,sizeof(void*)==sizeof main
,因此您只需将该值解释为一个void*
,它可能就是函数的地址
使用格式说明符%d
将函数地址传递给printf()
,情况更糟,因为很可能是sizeof(int)!=sizeof main
,然后得到未定义的行为
这不是好代码。第一个打印函数的地址,如果
sizeof(void*)
等于sizeof(int),第二个打印函数的地址
在您的平台上,但这通常被认为是未定义的行为。@TheBigH,我不知道函数指针这一术语。并非巧合,0x401318==4199192。关于%d说明符有什么关系?OP正在打印指针的值(函数的地址),而不是指针的地址。此外,只有当sizeof(void*)
等于sizeof(int)时,才能保证对printf
的第二次调用正常工作
在OP的平台上,但这通常被认为是未定义的行为。最后一件事——我不是对你的答案投反对票的人,所以请不要对我自己的随机答案投反对票。它们是相同的值。%p
将其格式化为十六进制,%d
将其格式化为十进制。0x401318==4199192
@robert:那不是真的。例如,如果OP在64位平台(64GB内存地址空间)上运行,那么%p
将相当于%lld
(或者更准确地说,相当于%llx
)。但对“%p
的否决票应该可以。函数指针与void*
指针不兼容。
00401318
4199192