当我尝试编译以下代码时,我收到一个错误:“在参数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。
的内容答案 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指针的指针”相同