正在打印的是垃圾值吗?

Is it garbage value that is being printed?

    #include <stdio.h>
    #include <conio.h>
    int f(int a){
        int i,f=1;
        for(i=1; i<a; i++)
            f=f*i;
        return f;
    }
    void main(){
        int k;
        clrscr();
        int (*u)(int);
        u=&f;
        printf("%d", u);
        getch();
    }

上面的代码在TurboC++上打印出657,输出不随时间变化,难道不是垃圾值吗?

    #include <stdio.h>
    int f(int a){
        int i,f=1;
        for(i=1; i<a; i++)
        f=f*i;
        return f;
    }
    int main(){
        int k;
        int (*u)(int);
        u=&f;
        printf("%d", u);
        return 0;
    }

而这个修改版的代码,returns:

    4199220 on CodeBlocks
    4199728 on DevC++
    134521824 on OnlineIDE
    134513824 on gcc 4.9.2

而且这些值似乎不会随着不同的运行而改变。 输出当然依赖于编译器,但是 请解释这个输出是如何产生的?

同声明

printf("%d", u);

您将 指针 u 打印为十进制数,即您打印 u 的值,它指向什么。

这个地址可能不同,因为不同的编译器和链接器可能会将它放在不同的地方,没有 "standard" 放置函数的地方。

此外,由于您使用格式 "%d" 来打印指针,因此该行为在技术上是 未定义。要打印指针,您应该使用 "%p" 格式,并将指针转换为 void *(有关更多信息,请参见 this printf (and family) reference)。

printf("%d", u);

上一行u是一个指向函数的指针。当您将此地址解释为 int 并打印它时,行为未定义。