gpt4 book ai didi

c - 如果不作为函数调用,printf 会返回什么?

转载 作者:太空宇宙 更新时间:2023-11-04 00:52:45 25 4
gpt4 key购买 nike

此代码在注释语句一后工作正常。语句二给出了一些垃圾值,但至少它运行了。我不明白如果参数中的 printf 没有作为函数调用,它如何给出一个值?

#include<stdio.h>

int main()
{
int printf = 123; // statement one
printf ("%d", printf); // statement two
return 0;
}

最佳答案

不带圆括号的函数名称不返回值 - 它求值为函数的地址(即它是类型为 size_t (*)(const char * , ...))。本质上,这是 CPU 在遇到对 printf() 的调用时将在指令之间跳转的地址。

顺便说一下,如果我没记错的话,分配给一个函数的名字是未定义的行为,使用 %d 格式说明符打印一个指针也是如此——你应该使用

printf("%p", (void *)printf);

此外,您可以声明函数指针,为它们分配另一个函数的地址并调用它们就好了:

size_t (*my_printf)(const char *, ...) = printf;
my_printf("This actually called printf!\n");

printf("my_printf: %p\n", (void *)my_printf);
printf("original printf: %p\n", (void *)printf);

最后两个语句打印相同的地址。

编辑:严格来说,即使是上述“解决方案”也是非标准的,因为标准不保证函数指针可以转换为数据指针类型。这基本上意味着无法打印函数的地址,但是,在大多数系统上,转换为 void * 显然 是可行的。

关于c - 如果不作为函数调用,printf 会返回什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12760301/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com