为什么 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
.
的参数类型不正确
看下面的代码:
#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
.