看下面的代码:
#includeint 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
IS char *
(从衰减char (*)[80]
),而&str
具有的类型char (*)[80]
,虽然它们具有相同的值,即&str[0]
.
那么为什么可以scanf("%s",&str);
正常工作而不会因指针运算而导致段错误呢?
两个指针值(str
和&str
)具有相同的二进制值,即地址str
.但是,它们具有不同的类型:作为参数传递时,str
转换为类型char *
,而&str
具有类型char (*)[80]
.前者是正确的,而后者是不正确的.它工作正常,但你使用的指针类型不正确,实际上gcc
警告不正确的参数类型scanf
.