为什么使用scanf读入字符串缓冲区既可以使用与号(&;),也可以不使用符号(&;)? [英] Why does reading into a string buffer with scanf work both with and without the ampersand (&)?
本文介绍了为什么使用scanf读入字符串缓冲区既可以使用与号(&;),也可以不使用符号(&;)?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有点困惑。我的印象是,用scanf()
读取C字符串的正确方法应该是
(不要管可能的缓冲区溢出,这只是一个简单的示例)
char string[256];
scanf( "%s" , string );
但是,以下方法似乎也有效,
scanf( "%s" , &string );
这只是我的编译(GCC),纯属运气,还是别的什么?
推荐答案
数组"衰减"成指向其第一个元素的指针,因此scanf("%s", string)
等同于scanf("%s", &string[0])
。另一方面,scanf("%s", &string)
传递一个指向-char[256]
的指针,但它指向相同的位置。
scanf
在处理其参数列表的尾部时,将尝试拉出一个char *
。当您传入string
或&string[0]
时,这是正确的,但是当您传入&string
时,您依赖于语言标准不保证的东西,即指针&string
和&string[0]
--指向在同一位置开始的不同类型和大小的对象的指针--以相同的方式表示。
我不相信我遇到过不能工作的系统,而且在实践中您可能是安全的。尽管如此,它仍然是错误的,而且在某些平台上可能会失败。(假设的示例:每个指针都包含类型信息的"调试"实现。我认为Symbolics"Lisp机器"上的C实现做了这样的事情。)
这篇关于为什么使用scanf读入字符串缓冲区既可以使用与号(&;),也可以不使用符号(&;)?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文