最简单的形式是
int main(){
int x;
scanf("%d",x);
}
当我们给这个程序任何数值作为输入时,它会通过产生一个我们应该期望的段错误信号而失败。
但如果我们改为给它任何字母数字值,就不会失败。
产生此行为的scanf
发生了什么?
这是使用数值运行gdb时的回溯:
(gdb) bt
#0 0x00000034e7456ed0 in _IO_vfscanf_internal () from /lib64/libc.so.6
#1 0x00000034e74646cd in __isoc99_scanf () from /lib64/libc.so.6
#2 0x0000000000400553 in main ()
那么为什么不没有任何字母数字值,例如' a'或者' dfgb'?
答案 0 :(得分:5)
标准的第7.21.6.2/10节说:
如果输入项不是匹配序列,则执行 指令失败:此条件是匹配失败。
和7.21.6.2/4:
fscanf函数依次执行格式的每个指令。 当所有指令都已执行时,或指令失败时(如 详情如下),函数返回。故障被描述为输入 失败(由于编码错误的发生或 输入字符不可用)或匹配失败(由于 不恰当的输入)。
由于您的输入没有提供良好的可解析整数,scanf
只返回0表示没有从输入转换,也不会尝试取消引用您传递的参数。
这个答案经过编辑,引用了关于这一点的标准,感谢@Zwol 。