这个价值来自哪里?

时间:2017-12-16 15:47:51

标签: c visual-studio gcc printf stdio

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

#include <stdio.h>
int main(void) {

printf("%d");
return 0;
}

结果: 13242433

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

3 个答案:

答案 0 :(得分:2)

这是什么?

未定义的行为。(选中 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

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

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

答案 1 :(得分:1)

这是未定义的行为。在%d中使用printf时,它需要int类型的参数。

答案 2 :(得分:-1)

嗯,gcc在编译代码时会显示警告:

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

我不确定但是如果您使用Visual Studio,则可能存在一些错误。在这种情况下,您应该发布问题here