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

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

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

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

 scanf("%s",&str); 

它通过编译,并工作。

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

它是未定义的行为(因为scanf()期望的类型是char * ,但你传入一个char (*)[256] ),但它通常“工作”(似乎工作),因为数组的地址通常是相同(关于指针的数值)作为其第一个元素的地址。

从官方文档 :

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

(强调我的)

这是技术上未定义的行为。 但是,这两种方法都在实践中使用char数组,因为str的传递给scanf()转换为指向第一个元素的指针,它将等于指向数组本身的指针( str的地址,或者&str ),所以相同的值以任何一种方式传递。

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

 int myInt; scanf("%d", &myInt); 

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

* Win16除外。

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