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表明这是不确定的行为,但这在实践中始终有效。