c-为什么可以将双指针(地址的地址)传递给scanf

  • 本文关键字:地址 scanf 指针 c scanf
  • 更新时间 :
  • 英文 :


这个简单的代码就是我所期望的:

#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]

当然,这取决于您是要处理警告还是忽略它;但是,在更复杂的代码中,这种"错误"可能会导致运行时错误,这些错误很难追踪。

最新更新