为什么使用scanf读入字符串缓冲区既可以使用与号(&),也可以不使用符号(&)? [英] Why does reading into a string buffer with scanf work both with and without the ampersand (&)?

查看:16
本文介绍了为什么使用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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆