Kon*_*lph 10
这就是为什么:
printf("%s\n", 42); // this will clobber the stream
Run Code Online (Sandbox Code Playgroud)
这将导致缓冲区溢出 - 编译器通常无法检查第一个参数中的格式字符串printf是否与后续参数的类型相对应.它可以在上述情况下执行此操作 - 因为字符串是硬编码的 - 而且有些编译器会这样做.1但是通常格式字符串可以在运行时确定,因此编译器无法检查其正确性.
1但这些检查是特殊的printf.如果你写你自己的myprintf具有相同签名的功能printf,就没有办法来检查类型安全,因为签名使用省略号...这elides函数内的所有类型的信息.
的printf家庭功能是可变参数的功能,因为它们都使用省略...这意味着参数(一个或多个)任何类型,只要能够传递给函数...而言.有没有限制由编译器,因为有没有要求的类型的参数.编译器不能强加任何类型安全规则,因为省略号...允许所有类型.该函数使用格式字符串来假设参数类型(即使存在不匹配!!).该格式字符串被读取并在运行时,而此时编译器解释不能,如果有不匹配,因为代码已经编译做任何事情.所以这样,这不是类型安全的.通过类型安全,我们通常意味着编译器能够通过对(未评估的)表达式的类型强加规则来检查程序的类型一致性.
需要注意的是,如果不匹配(其功能想不通!),程序进入未定义行为区,那里的程序的行为是不可预测的,理论上任何事情都可能发生.
您可以将相同的逻辑扩展到任何可变函数函数,例如scanffamily.