【问题标题】:How does a string differ from an array of char pointers in C?字符串与 C 中的 char 指针数组有何不同?
【发布时间】:2009-04-08 01:23:01
【问题描述】:

我的印象是它们是同一回事。然而,在我看来,他们在这里受到了不同的对待。我感到困惑的部分看起来像这样。

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。 我对指针缺少什么?

【问题讨论】:

    标签: c pointers


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      行:

      char* player_name[25];
      

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

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

      在 C 中,当您使用不带下标的数组名称时,它会“分解”为指向数组第一个元素的指针。

      所以...当这行被执行时:

      scanf("%s", player_name);
      

      player_name 指向 100 字节的内存,足够容纳 100 个读入的字符(以及 99 个字符加上终止的 NUL 字节)。编译器不会保护您免于将这些字符存储在为 25 个指针分配的内存中。

      最后:

      foo = initFoo(player_name);
      

      将数组的起始地址传递给函数 initFoo()。编译器知道这可能是错误的,因为 initFoo() 应该采用指向 chars 的指针,而不是指向 char 指针数组的指针,但它让你无论如何都可以这样做,除了警告。 initFoo() 中的 printf() 语句将该指针重新解释为 char 指针,您会得到正确的结果!

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

      char player_name[25];
      

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

      【讨论】:

        【解决方案3】:
        char* player_name[25];  /* means an array of character pointers. */
        char  player_name[25];  /* will get rid of the warning */
        

        【讨论】:

          【解决方案4】:

          修改为:

          char player_name[25];
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-11-21
            • 1970-01-01
            • 1970-01-01
            • 2015-05-19
            • 2010-12-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多