当我们通常输入字符串时,我们这样做:
#include <stdio.h>
int main()
{
char str[256];
scanf("%s",str);
//Other Operation
}
但是,今天,在编程课上,我的一个朋友写了这样的scanf
行:
scanf("%s",&str);
它通过编译,并且有效。
问题是,我想知道这是否在C中是“合法的”,还是只是一个未定义的行为?
答案 0 :(得分:6)
它的未定义行为(因为scanf()
预期的类型为char *
,但您传入的是char (*)[256]
),但它通常&#34;工作&#34; (似乎正在工作)因为数组的地址通常与其第一个元素的地址相同(关于指针的数值)。
如果此对象没有合适的类型,或者无法在提供的空格中表示转化结果,行为未定义。
(强调我的)
答案 1 :(得分:2)
这是技术上未定义的行为。但是,这两种方法在实践中都使用char数组,因为传递给str
的{{1}}的引用变成了指向第一个元素的指针,它与指向数组本身的指针相等*(地址scanf()
或str
),因此无论如何都会传递相同的值。
我不确定你到目前为止是否只使用字符串,但要记住,如果你看一下不是数组的东西,就更容易判断你朋友的方法是否正确:
&str
int myInt;
scanf("%d", &myInt);
正在寻找一个指针,所以你想给它一个整数变量的地址。这是因为传递scanf()
给它一个值(当前是垃圾),而myInt
告诉它 where 放置它读取的值。
* Win16除外。
答案 2 :(得分:0)
str
和&str
都定义为获取数组第一个元素的内存地址的值。尽管H2CO3表明这是不确定的行为,但这在实践中始终有效。