初始化char的指针数组

时间:2009-07-19 08:16:55

标签: c arrays pointers

当我尝试编译以下代码时,我收到一个错误:“在参数1中键入错误以'分配';在指示的行中找到'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(&amp; data)但是这样我收到以下错误:“在参数1中输入错误'分配';找到'char *(*)[3]' ,预计'char *'“。

很明显,我正在尝试制作* data [] == buf。

的内容

3 个答案:

答案 0 :(得分:4)

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

当你将它们作为你想要的函数参数传递时,数组会衰减到指针,所以allocate的声明需要是void allocate(char**)。传入data将传入指向数组第一个元素的指针,即指向char*的指针。

在分配中,您需要为新字符串分配一些内存。我假设这是一个测试示例,你确实需要为数组的每个成员分别创建字符串副本。

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

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]);
        }
    }
}

答案 1 :(得分:0)

问题出在可变数据的声明中。您已指定指针(*)和数组([])。实际的数据类型是指针值数组。

出于此特定重载的目的,数组充当另一个指针,因此您在数据(char**)中有一个char指针指针。函数allocate期望单个指针值。

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

char data[3];

答案 2 :(得分:0)

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

只需更改

void allocate(char *dt)

void allocate(char **dt)

或(等效地)

void allocate(char *dt[])

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