或者换句话说:可能错误printf/ fprintf十进制整数(%d,%u,%ld,%lld)格式化字符串导致程序崩溃或导致未定义的行为?
Cosinder以下代码行:
#include <iostream>
#include <cstdio>
int main() {
std::cout << sizeof(int) << std::endl
<< sizeof(long) << std::endl;
long a = 10;
long b = 20;
std::printf("%d, %d\n", a, b);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
32位架构的结果:
4
4
10, 20
Run Code Online (Sandbox Code Playgroud)
64位架构的结果:
4
8
10, 20
Run Code Online (Sandbox Code Playgroud)
在任何情况下,程序都会打印出预期的结果.我知道,如果long值超出int范围,程序会打印错误的数字 - 这很难看,但不影响程序的主要目的 - 但除此之外,是否会发生意外情况?
如果使用错误的格式字符串调用printf会发生什么?
任何事情都可能发生.这是未定义的行为!
未定义的行为意味着任何事情都可能发生.它可能会显示您期望的结果,也可能没有结果,也可能会崩溃.任何事情都可能发生,你可以责怪没有人,除了你自己.
参考:
c99标准:7.19.6.1:
第9段:
如果转换规范无效,则行为未定义.225)如果任何参数不是相应的转换规范的正确类型,则行为是未定义的.
| 归档时间: |
|
| 查看次数: |
2344 次 |
| 最近记录: |