为什么 scanf("%s",&str);表现为 scanf("%s",str);?

Why scanf("%s",&str); behaves as scanf("%s",str);?

看下面的代码:

#include <stdio.h>

int main()
{
    char str[80];
    int n;
    scanf("%s%n",str,&n);
    printf("%s\t%d",str,n);
    putchar('\n');
    getchar(); //to remove '\n'
    scanf("%s%n",&str,&n);
    printf("%s\t%d",str,n);
    return 0;
}

这是输入和输出:

abc
abc     3
123
123     3

我们知道,scanf是一个变参函数,所以调用时不会强制转换参数。因此,参数必须以 type 的形式准确传递。然而,str的类型是char *(从char (*)[80]衰减),而&str的类型是char (*)[80],虽然它们有相同的[=28] =]值,即&str[0].

那么为什么scanf("%s",&str);可以正常工作而不会由于指针运算而导致段错误?

两个指针值(str&str)具有相同的二进制值,即str的地址。但是,它们确实具有不同的类型:当作为参数传递时,str 被转换为类型 char *,而 &str 的类型为 char (*)[80]。前者是正确的,而后者是错误的。它有效,但您使用的指针类型不正确,实际上 gcc 警告 scanf.

的参数类型不正确