为什么使用 scanf 读入字符串缓冲区可以在有或没有与号 (&) 的情况下工作?

2024-02-19

我对某事有点困惑。我的印象是读取 C 字符串的正确方法是scanf()沿着

(不用担心可能的缓冲区溢出,这只是一个简单的例子)

char string[256];
scanf( "%s" , string );

然而,以下似乎也有效,

scanf( "%s" , &string );

这只是我的编译器(gcc)、纯粹的运气还是其他原因?


数组“衰减”为指向其第一个元素的指针,因此scanf("%s", string)相当于scanf("%s", &string[0])。另一方面,scanf("%s", &string)传递一个指向-的指针char[256],但它指向同一个地方。

Then scanf,在处理其参数列表的尾部时,将尝试拉出一个char *。当你通过时,这就是正确的事情string or &string[0],但是当你通过了&string您依赖于语言标准无法保证的东西,即指针&string and &string[0]-- 指向从同一位置开始的不同类型和大小的对象的指针 -- 以相同的方式表示。

我相信我还没有遇到过无法正常工作的系统,而且实际上您可能是安全的。尽管如此,这是错误的,并且在某些平台上可能会失败。 (假设示例:“调试”实现,其中包含每个指针的类型信息。我think符号“Lisp Machines”上的 C 实现做了类似的事情。)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么使用 scanf 读入字符串缓冲区可以在有或没有与号 (&) 的情况下工作? 的相关文章

随机推荐