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

看下面的代码:

#include  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是一个可变参数函数,因此在调用它时它的参数不会被强制转换。 因此,参数必须以与它们应该完全相同的类型传递。 但是, str的类型是char * (从char (*)[80]衰减),而&str的类型为char (*)[80] ,尽管它们具有相同的 ,即&str[0]

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

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