代码之家  ›  专栏  ›  技术社区  ›  Aniq55

正在打印的是垃圾值吗?

  •  -2
  • Aniq55  · 技术社区  · 8 年前
        #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;
        }
    

    此代码的修改版本将返回:

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

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

    2 回复  |  直到 8 年前
        1
  •  4
  •   Some programmer dude    8 年前

    在声明中

    printf("%d", u);
    

    您可以打印 指针 u 作为十进制数字,即打印 u ,它指的是什么。

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

    此外,由于您使用的是 "%d" 要打印指针,行为在技术上是 未定义 。要打印指针,应使用 "%p" 格式化,并将指针强制转换为 void * (参见示例。 this printf (and family) reference 了解更多信息)。

        2
  •  3
  •   Mohit Jain    8 年前
    printf("%d", u);
    

    在上面的行中 u 是指向函数的指针。当您将此地址解释为 int 打印出来,行为是不确定的。