用指针指向C中的分段错误

ult*_*ohn 1 c segmentation-fault

为什么以下代码终止于分段错误,为什么备用版本即注释代码不?这两个版本的代码看起来和我一样.我错过了什么?

    #include <stdio.h>
  1 
  2 void get_input(char**); // void get_input(char*);
  3 
  4 int main(void)
  5 {
  6   char name[20];
  7   get_input((char**)&name); //get_input(name);
  8   printf("%s", name);
  9   
 10 }
 11 
 12 void get_input(char** m)//get_input(char* m)
 13 {
 14   scanf("%s", *m); // scanf("%s", m);
 15 }
Run Code Online (Sandbox Code Playgroud)

n. *_* m. 5

name是一个字符数组.它的类型是char[20].

在某些情况下,数组会衰减为指针.这不是其中之一.

C标准特别提到运算符地址的参数不会衰减.将address-of运算符应用于数组名称的结果不出所料是数组的地址.

在这种情况下&name有类型char (*)[20].这种类型非常不同char**.前者描述了一个指向包含20个字符的内存位置的指针.后者描述了指向存储器位置的指针,该存储器位置包含指向包含字符的另一个存储器位置的指针.你不能把一个投射到另一个并希望它会起作用.