当我们通常输入字符串时,会执行以下操作:
#include <stdio.h>
int main()
{
char str[256];
scanf("%s",str);
//Other Operation
}
但是,今天在编程课上,我的一个朋友写了这样一行:
scanf("%s",&str);
它通过了编辑,并开始工作。
问题是,我想知道这是否在C语言中是“合法”的,还是只是一种未定义的行为?
最佳答案
它是未定义的行为(因为scanf()
预期的类型是char *
,但您传入了一个char (*)[256]
),但它通常“工作”(似乎正在工作),因为数组的地址通常与其第一个元素的地址相同(关于指针的数值)。
从official documentation开始:
如果此对象没有适当的类型,或者如果转换的结果不能在提供的空间中表示,则行为是未定义的。
(强调我的)