初始化字符指针数组

3

当我尝试编译以下代码时,我收到一个错误:“在指定的行(<<<<<)中发现argument 1 to 'allocate'; found 'char * *', expected '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),但是出现了以下错误:"Type error in argument 1 to 'allocate'; found 'char * (*)[3]', expected 'char *'"。
很明显,我想让*data[]的内容等于buf。
3个回答

4
看起来 allocate 函数试图动态分配三个字符串,并将它们分配到三个 char* 指针数组的每个成员中。
当你将数组作为函数参数传递时,它们会自动转换为指针,这正是你想要的,因此 allocate 的声明需要是 void allocate(char**)。将 data 传入将传入一个指向数组第一个元素即 char* 指针的指针。
在 allocate 中,您需要为新字符串分配一些内存。我假设由于这是一个测试示例,您确实希望为数组的每个成员分别创建单独的字符串副本。
当然,在这一点上,您可能需要一个 deallocate 函数,并确保始终调用它以执行相应的 malloc 的 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]);
        }
    }
}

0
问题在于变量data的声明。您同时指定了指针(*)和数组([])。实际上,data的类型是指针值的数组。
对于这个特定的重载,数组充当另一个指针,因此您在data中有一个char指针指针(char **)。函数allocate期望一个单一的指针值。
您可以通过消除数据类型声明中的指针部分来解决这个问题。
char data[3];

但是在分配函数中的strcpy和for循环没有任何意义,而且非常危险? - CB Bailey
1
Jared:我正在尝试填充一个指向字符的3个指针数组。 char data[3]不是表示一个由3个字符组成的数组吗? - Paul
@Charles,是的,它们是。最初的问题是为什么我会得到这个消息,我试图掩盖它。 - JaredPar
很好,我不反对这个解释,只是在质疑“修复”这个词。 - CB Bailey

0

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

只需更改

void allocate(char *dt)

void allocate(char **dt)

或(等价地)

void allocate(char *dt[])

allocate的参数在逻辑上是“一个字符串数组”,这与“一个字符指针数组”相同,而就参数而言,这与“一个指向字符指针的指针”相同。

Tyler:那么我该如何表达分配(allocate())的参数? - Paul

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接