<分区>
看下面的代码:
#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]
类型,尽管它们具有相同的值,即 &str[0]
。
那么为什么scanf("%s",&str);
可以正常工作而不会因为指针运算而导致段错误呢?