当我们通常输入字符串时,会执行以下操作:

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

但是,今天在编程课上,我的一个朋友写了这样一行:
scanf("%s",&str);

它通过了编辑,并开始工作。
问题是,我想知道这是否在C语言中是“合法”的,还是只是一种未定义的行为?

最佳答案

它是未定义的行为(因为scanf()预期的类型是char *,但您传入了一个char (*)[256]),但它通常“工作”(似乎正在工作),因为数组的地址通常与其第一个元素的地址相同(关于指针的数值)。
official documentation开始:
如果此对象没有适当的类型,或者如果转换的结果不能在提供的空间中表示,则行为是未定义的。
(强调我的)

07-24 09:38
查看更多