为什么将字符串传递给scanf()在C中编译得很好?

Des*_*tor 5 c scanf undefined-behavior

我最近编写了一个简单的程序,我错误地使用scanf()而不是printf()来在控制台上显示消息.我希望得到编译时错误,但它编译好,没有警告和运行时崩溃.我知道scanf()用于从键盘输入.我不应该在以下程序中出错吗?

#include <stdio.h>
int main()
{
    scanf("Hello world");   // oops, It had to be printf()
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

它是否调用未定义的行为(UB)?在C标准中有没有提到这个?为什么在编译时不检查是否将正确有效的参数传递给scanf()函数?

edm*_*dmz 6

代码表现正常.的确,scanf已经宣布了

int scanf(const char *format, ...);
Run Code Online (Sandbox Code Playgroud)

幸运的是,你format不包含任何%没有通信的内容...,这会调用UB.
此外,format是一个字符串文字,它允许编译器通过它,确保您传递与格式说明符相关的正确类型的参数,作为启用更高警告级别的完整性检查的一部分.(-Wformat family)


Cia*_*Pan 6

传递一个字符串来scanf编译很好,因为它scanf 需要一个字符串作为第一个参数.有关详细scanf说明,请参阅文档或编程手册.