这个简单的代码就是我所期望的:
#include <stdio.h>
int main()
{
char input[20];
printf("enter a string: ");
scanf("%[^n]s", input);
printf("input: %sn", input);
}
其中CCD_ 1是CCD_。但是为什么我可以通过这个:
#include <stdio.h>
int main()
{
char input[20];
printf("enter a string: ");
scanf("%[^n]s", &input);
printf("input: %sn", input);
}
它仍然编译和运行?传递的参数&input
应该是(char**)[20]
,这不应该是正确的,但它正在运行。为什么?
在您的代码中,表达式input
(用作scanf
的参数时(将计算(即衰变(为20个字符数组的第一个元素的地址,而表达式&input
将计算为数组本身的地址-这将是相同的,在本例中为。这可以通过在代码中添加如下行来证明:
printf("%p %pn", (void*)(input), (void*)(&input)); // Print the two addresses - SAME!
因此,对scanf
的调用实际上会传递正确的值(输入缓冲区的地址(。
但是,一个好的编译器会警告您不兼容的指针类型;例如,clang cl生成以下内容:
警告:format指定类型"char*",但参数具有类型"char(*([20]"[-Wformat]
当然,这取决于您是要处理警告还是忽略它;但是,在更复杂的代码中,这种"错误"可能会导致运行时错误,这些错误很难追踪。