为什么scanf(“%s”,& str);表现为scanf(“%s”,str);?

时间:2016-01-10 10:18:51

标签: c pointers scanf pointer-arithmetic

请查看以下代码:

#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);可以正常工作而不会因指针算法而导致段错误?

1 个答案:

答案 0 :(得分:10)

两个指针值(str&str)具有相同的二进制值,即str的地址。但是,它们具有不同的类型:当作为参数传递时,str将转换为char *类型,而&str具有类型char (*)[80]。前者是正确的,而后者是不正确的。它可以工作,但是您使用的指针类型不正确,实际上gcc警告scanf的参数类型不正确。

相关问题