请查看以下代码:
#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
是一个变量参数函数,因此在调用它时它的参数不会被强制转换。因此,参数必须以类型的形式传递。但是,str
的类型为char *
(已从char (*)[80]
生效),而&str
的类型为char (*)[80]
,但它们具有相同的值,即&str[0]
。
那么为什么scanf("%s",&str);
可以正常工作而不会因指针算法而导致段错误?
答案 0 :(得分:10)
两个指针值(str
和&str
)具有相同的二进制值,即str
的地址。但是,它们具有不同的类型:当作为参数传递时,str
将转换为char *
类型,而&str
具有类型char (*)[80]
。前者是正确的,而后者是不正确的。它可以工作,但是您使用的指针类型不正确,实际上gcc
警告scanf
的参数类型不正确。