今天在 Linuxsir 上看到一个关于 scanf 的讨论,如下函数的输出是什么?
可以试试。别人试过在 Gentoo 上用 gcc 4.1 4.3 均输出不同的值,但在 Ubuntu 上两个 c 的输出值是相同的。
出问题的地方不在那个 int i = -1,而是那个 scanf。直接 man 3 scanf,可以发现,scanf 函数在处理转换的时候,如果给它的是 %c,那么它就将后面的那个指针当成是 char 类型的指针,但此程序中 &c 本来是 int 型指针,所以输出到 c 中的值只有其最低地址的那个 byte 有效,其它的是垃圾。因此输出结果当然不是我们所想的结果。
阅读了 scanf/printf 的手册 (man 3 printf),似乎可以这样来理解其转处理机制:scanf 中类型转换符是给 scanf 函数指出那个相应的输入指针的类型,%d 是 int *, %c 是 char *, %x 是 unsigned int *,%f 是 float *, %lf 是 double *;而 printf 则不同,它认为它的参数只有如下几种类型:int , unsigned int, double, long int,其类型转换符是用来指出相应的参数的输出格式。这样不难理解 printf 可以用 %c 来输出一个 int,或用 %f 输出 double,而 scanf 严格很多,因为它使用了可变参数列表,使得它不能检查参数的类型,因此如果遇到 %c,它只能认为那个相应的指针是 char 型的并向其中写入数据,当然后果可想而知。