是否正在打印垃圾值?

时间:2016-05-02 08:45:53

标签: c pointers output function-pointers

0.99869

以上代码在TurboC ++上打印657,输出不随时间变化,那么它不是垃圾值吗?

    #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();
    }

这段代码的修改版本返回:

    #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;
    }

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

2 个答案:

答案 0 :(得分:3)

声明

printf("%d", u);

您将指针 u打印为十进制数字,即打印u的值,指向的内容。

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

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

答案 1 :(得分:3)

printf("%d", u);

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