为什么这个C程序不会导致字母数字值出现分段错误?

时间:2016-07-22 14:04:18

标签: c debugging gdb internal

最简单的形式是

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'?

1 个答案:

答案 0 :(得分:5)

标准的第7.21.6.2/10节说:

  

如果输入项不是匹配序列,则执行   指令失败:此条件是匹配失败。

和7.21.6.2/4:

  

fscanf函数依次执行格式的每个指令。   当所有指令都已执行时,或指令失败时(如   详情如下),函数返回。故障被描述为输入   失败(由于编码错误的发生或   输入字符不可用)或匹配失败(由于   不恰当的输入)。

由于您的输入没有提供良好的可解析整数,scanf只返回0表示没有从输入转换,也不会尝试取消引用您传递的参数。

这个答案经过编辑,引用了关于这一点的标准,感谢@Zwol