【问题标题】:Initializing array of pointers to char初始化指向 char 的指针数组
【发布时间】:2009-07-19 08:16:54
【问题描述】:

当我尝试编译以下代码时,我收到一个错误:“在参数 1 中输入错误到 'allocate';在指示的行找到 'char * *',预期的 'char *” (

#include <stdio.h>
#include <string.h>

void allocate(char *dt);

int  main(void)
{
  char *data[3];

  allocate(data); <<<<<
    return 0;
}

void allocate(char *dt)
{ 
  int i;
  char buf[] = "A test string";

  for (i = 0; i < 3; i++){
    strcpy(&dt[i], buf);
    printf("%s\n", dt[i]);
  }
} 

我的理解是我应该这样调用 allocate:allocate(&data) 但是我收到以下错误:“在参数 1 中输入错误到 'allocate';找到 'char * (*)[3]', expected 'char *'"。

很明显,我正在尝试使 *data[] == buf 的内容。

【问题讨论】:

    标签: c arrays pointers


    【解决方案1】:

    看起来 allocate 正在尝试动态分配三个字符串,并将它们分配给由三个 char* 指针组成的数组的每个成员。

    当您将数组作为您想要的函数参数传递时,数组会衰减为指针,因此allocate 的声明需要为void allocate(char**)。传入data 将传入指向数组第一个元素的指针,即指向char* 的指针。

    在分配中,您需要为新字符串分配一些内存。我假设这是一个测试示例,因此您确实希望为数组的每个成员提供单独的字符串副本。

    当然,此时您可能需要一个deallocate 函数,并确保始终调用它来为新的mallocs 执行相应的free

    void allocate(char** dt)
    { 
        int i;
        size_t len;
    
        char buf[] = "A test string";
        len = sizeof buf;
    
        for (i = 0; i < 3; i++)
        {
            dt[i] = malloc(len);
            if (dt[i] != NULL)
            {
                memcpy(dt[i], buf, len);
                printf("%s\n", dt[i]);
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

      问题在于变量数据的声明。您已经指定了一个指针 (*) 和一个数组 ([])。数据的实际类型是指针值数组。

      为了实现这个特定的重载,数组充当另一个指针,因此数据中有一个 char 指针指针 (char**)。函数 allocate 需要一个指针值。

      您可以通过消除数据类型声明的指针部分来解决此问题。

      char data[3];
      

      【讨论】:

      • 但是 allocate 中的 strcpy 和 for 循环没有任何意义而且很危险?
      • Jared:我实际上是在尝试填充一个包含 3 个指向 char 的指针的数组。 char data[3] 不是指 3 个字符组成的数组吗?
      • @Charles,是的。直接的问题是为什么我会收到我试图报道的这条消息。
      • 很公平,我不同意这个解释,我只是质疑“修复”。
      【解决方案3】:

      主要是正确的。分配错了。

      简单的改变

      void allocate(char *dt)
      

      void allocate(char **dt)
      

      或(等效)

      void allocate(char *dt[])
      

      要分配的参数在逻辑上是“字符串数组”,与“字符指针数组”相同(就参数而言)与“指向字符指针的指针”相同.

      【讨论】:

      • Tyler:那我该如何表达 allocate() 的论点?
      猜你喜欢
      • 1970-01-01
      • 2010-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-28
      • 2011-04-10
      • 2012-12-19
      • 1970-01-01
      相关资源
      最近更新 更多