代码之家  ›  专栏  ›  技术社区  ›  Jamison Dance

字符串与C中的char指针数组有何不同?

  •  1
  • Jamison Dance  · 技术社区  · 16 年前

    我觉得他们是一样的。然而,在我看来,他们在这里的待遇是不同的。我对这个部分感到困惑。

    Foo* initFoo(char* name);
    
    int main
    {
      Foo* foo;
      char* player_name[25];
      scanf("%s", player_name);
      foo = initFoo(player_name);
    }
    
    Foo* initFoo(char* name)
    {
      printf("\n%s", name);
    }
    

    这根绳子印得很好。但是,我收到一个编译器警告,说:从不兼容的指针类型传递“initfoo”的参数1。 关于指针我遗漏了什么?

    4 回复  |  直到 12 年前
        1
  •  7
  •   1800 INFORMATION    16 年前

    字符串是字符数组。这里有一个指向字符的指针数组。

        2
  •  6
  •   Jeremy    16 年前

    线:

    char* player_name[25];
    

    为char分配一个25元素的指针数组。指向char的指针通常被视为字符串,因此此声明可以解释为字符串数组,但用于存储这些字符串的内存尚不存在。您必须单独分配这些字符串。

    假设指针在您的机器上是4个字节,这一行将具有分配25 x 4=100个字节的效果。

    在C语言中,当使用没有下标的数组名时,它会“分解”为指向数组第一个元素的指针。

    所以…执行此行时:

    scanf("%s", player_name);
    

    播放器名称指向100字节的内存,足够容纳100个读取字符的空间(99个字符加上一个终止的nul字节)。编译器不保护您将这些字符存储在为25个指针分配的内存中。

    最后:

    foo = initFoo(player_name);
    

    正在将数组的起始地址传递给函数initfoo()。编译器知道这可能是错误的,因为initfoo()应该采用指向chars的指针,而不是指向char指针数组的指针,但它允许您执行除警告之外的任何操作。initfoo()中的printf()语句将该指针重新解释为char指针,您将得到正确的结果!

    如其他人所说,将一行改为

    char player_name[25];
    

    它声明一个25个字符的数组。

        3
  •  4
  •   Eddie    16 年前
    char* player_name[25];  /* means an array of character pointers. */
    char  player_name[25];  /* will get rid of the warning */
    
        4
  •  0
  •   sipsorcery    16 年前

    要修复它,请更改为:

    char player_name[25];