如果没有调用函数,printf会返回什么?

时间:2012-10-06 13:41:43

标签: c printf

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

#include<stdio.h>

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

2 个答案:

答案 0 :(得分:3)

在语句2中,当标识符printf传递给函数时,它是函数指针 - 指向函数printf的指针 - 和垃圾值是尝试使用printf和格式:%d打印此地址的结果:使用%d打印指针时应该会看到编译器警告。

答案 1 :(得分:2)

没有括号的函数名称不返回值 - 它计算函数的地址(即,它是size_t (*)(const char *, ...)类型的函数指针)。从本质上讲,这是每当遇到printf()调用时CPU将在指令之间跳转的地址。

顺便说一句,如果我没记错的话,分配给函数的名称是未定义的行为,那么使用%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 * 显然有效。