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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了这个价值来自哪里? [关闭]相关的知识,希望对你有一定的参考价值。

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

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

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

结果:13242433

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

答案

What is it?

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

Why is it so?

从标准7.21.6.1

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

How to avoid?

编译时也是

gcc -Wall -Wextra -Werror progname.c

给出错误(由于-Werror

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

这很清楚,可以告诉你出了什么问题。但你没有检查。

then what is that the fetched value? is that just garbage value?

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

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

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

另一答案

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

另一答案

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

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

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

以上是关于这个价值来自哪里? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

在哪里以及如何使用片段填充我的标签

解决方案电影标题中缺少代码的片段,完成挑战更多[关闭]

为 Blogger 上的博客格式化代码片段 [关闭]

WWDC 2011 示例代码 [关闭]

如何从片段内的列表视图打开链接网址?

从底部工作表对话框片段中获取价值