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

这个值来自哪里?[已关闭]

  •  -4
  • ghdrlfehd123  · 技术社区  · 7 年前

    我正在学习C语言的转换说明符部分。我知道%d用于在逗号后面打印值,但我不明白为什么 printf 当逗号后面没有值时打印某些内容。也没有编译错误。

    #include <stdio.h>
    int main(void) {
    
    printf("%d");
    return 0;
    }
    

    结果: 13242433

    有人能告诉我为什么在我运行此代码时会出现这个随机数字吗?

    3 回复  |  直到 7 年前
        1
  •  2
  •   user2736738    7 年前

    这是怎么一回事?

    未定义的行为。(检查 ref-1 , ref-2 )

    为什么会这样?

    来自标准 7.21.6.1

    这个 fprintf 函数将输出写入指向的流 stream , 在指向的字符串的控制下 format 指定如何 后续参数将转换为输出。 如果有 格式参数不足,行为未定义

    如何避免?

    也可以在编译时使用

    gcc -Wall -Wextra -Werror progname.c
    

    给出错误(由于 -Werror )

    error: format ‘%d’ expects a matching ‘int’ argument [-Werror=format=]
     printf("%d");
              ^
    

    这足够清楚地告诉你出了什么问题。但你没有检查。

    那么提取的值是什么?这只是垃圾值吗?

    很可能 printf 当看到 %d 说明符尝试读取一个 int 来自内存的变量值。但遗憾的是,记忆中没有任何对你有意义的东西。(甚至可能不允许访问该内存。)是的,这只是一些价值-垃圾价值。甚至不要认为每次你都会得到一些垃圾值——不要依赖它或任何类似的东西。这是未定义的行为。下次它可能会使你的程序崩溃,或者只是打印我的联系电话。 1,2

    答案的最后一部分解释了垃圾打印的可能原因。

    2. print my contact number -只是指出这只是一个垃圾值,你不应该关心它。此外,这是一种未定义的行为——即使看到垃圾值也不能保证每次都会发生。

        2
  •  1
  •   haccks    7 年前

    这是未定义的行为。什么时候 %d 用于 printf 然后它需要一个类型为的参数 int .

        3
  •  -1
  •   Jeff Holt    7 年前

    那么,gcc在编译代码时会显示一个警告:

    test.c: In function ‘main’:
    test.c:5:12: warning: format ‘%d’ expects a matching ‘int’ argument [-Wformat=]
     printf("%d");
             ^
    

    我不确定,但如果使用Visual Studio,可能会出现一些错误。在这种情况下,你应该发布你的问题 here .