char数组前面的&符是否会影响scanf?它合法吗?

时间:2013-08-13 16:42:48

标签: c arrays string scanf

当我们通常输入字符串时,我们这样做:

#include <stdio.h>
int main()
{
    char str[256];
    scanf("%s",str);
    //Other Operation
}

但是,今天,在编程课上,我的一个朋友写了这样的scanf行:

scanf("%s",&str);

它通过编译,并且有效。

问题是,我想知道这是否在C中是“合法的”,还是只是一个未定义的行为?

3 个答案:

答案 0 :(得分:6)

它的未定义行为(因为scanf()预期的类型为char *,但您传入的是char (*)[256]),但它通常&#34;工作&#34; (似乎正在工作)因为数组的地址通常与其第一个元素的地址相同(关于指针的数值)。

来自official documentation

  

如果此对象没有合适的类型,或者无法在提供的空格中表示转化结果,行为未定义。

(强调我的)

答案 1 :(得分:2)

这是技术上未定义的行为。但是,这两种方法在实践中都使用char数组,因为传递给str的{​​{1}}的引用变成了指向第一个元素的指针,它与指向数组本身的指针相等*(地址scanf()str),因此无论如何都会传递相同的值。

我不确定你到目前为止是否只使用字符串,但要记住,如果你看一下不是数组的东西,就更容易判断你朋友的方法是否正确:

&str

int myInt; scanf("%d", &myInt); 正在寻找一个指针,所以你想给它一个整数变量的地址。这是因为传递scanf()给它一个值(当前是垃圾),而myInt告诉它 where 放置它读取的值。

* Win16除外。

答案 2 :(得分:0)

str&str都定义为获取数组第一个元素的内存地址的值。尽管H2CO3表明这是不确定的行为,但这在实践中始终有效。