请查看以下代码:
#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);能够正常工作而不因指针算法而导致分段故障呢?
发布于 2016-01-10 10:27:50
两个指针值(str和&str)具有相同的二进制值,即str的地址。但是,它们确实有不同的类型:当作为参数传递时,str被转换为char *类型,而&str具有char (*)[80]类型。前者是正确的,后者是不正确的。它可以工作,但您使用的指针类型不正确,实际上,gcc警告scanf的参数类型不正确。
https://stackoverflow.com/questions/34704302
复制相似问题