c - 为什么扫描 ("%s",&str);表现为 scanf ("%s",str);?

标签 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是一个变参函数,所以调用时不会强制转换参数。因此,参数必须在 type 中准确传递。但是,str 的类型是 char *(从 char (*)[80] 退化),而 &str 具有 char (*)[80] 类型,尽管它们具有相同的,即 &str[0]

那么为什么scanf("%s",&str);可以正常工作而不会因为指针运算而导致段错误呢?

最佳答案

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

关于c - 为什么扫描 ("%s",&str);表现为 scanf ("%s",str);?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34704302/

相关文章:

c - 从路径名获取文件结构

无法使用代码块创建数据文件

ios - 引用同一变量时,Swift 数组内存地址发生变化

c - 合并两个 (uint8_t*) 指针并转换为十进制

c - 删除 BST 中的节点而不具有指向其父节点的指针

c - 即使使用语法 &(struct_pointer->struct_var) 在 scanf 中使用结构指针也不起作用

c - Turbo C 3.0 遵循哪个版本的 ANSI C 标准?

c 编程 scanf 不会读取输入两次

c - fscanf 在末尾扫描一个额外的字符

C snprintf 指定用户主目录