最简单的程序是

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”之类的任何字母数字值都不会失败?

最佳答案

该标准的第7.21.6.2/10条说:


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


和7.21.6.2/4:


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


由于您的输入没有提供良好的可解析整数,因此scanf只会返回0,以表示未从输入进行任何转换,因此请勿尝试取消引用您传递的参数。

编辑此答案是为了引用关于这一点的标准,这要感谢@Zwol。

10-06 04:36