无法将 char (*)[1000] 转换为 char **

Posted

技术标签:

【中文标题】无法将 char (*)[1000] 转换为 char **【英文标题】:cannot convert char (*)[1000] to char ** 【发布时间】:2015-03-31 20:53:53 【问题描述】:

我创建了一个名为 str 的 char 变量,并试图将它传递给一个函数。我不断收到error cannot convert char (*)[1000] to char **。我知道对于cannot convert char to char *,您只需在字符前面使用&,但我不知道在这种情况下该怎么做。我搜索了堆栈和谷歌,但没有运气。有什么想法吗?

 char str2[1000];
           strcpy(str2, "/home/" );
       strcat(str2, pw->pw_name );
        strcat(str2, "/Documents/test4.txt" );


    char bufTest[512];
    int link = GetSymbolicLinkTarget(&str2, bufTest, sizeof(bufTest));

这里是函数

int GetSymbolicLinkTarget(char *argv[], char *buf, size_t buf_size)
    int count = readlink(argv[1], buf, buf_size);
    if (count >= 0) 
        buf[count] = '\0';
    
    return count;

【问题讨论】:

“我创建了一个名为 str 的 char 变量,我试图将它传递给一个函数” - 哪个函数?您在代码中传递给它的唯一函数是 strcpy()strcat(),它们都不可能给您该错误消息。 char *argv[] 表示二维数组。您无法转换为 char **,因为两者不同。 我的想法是:如果您要编写 C++,请编写真正的 C++。我将从:std::string GetSymbolicLinkTarget(std::string const &input); @Aaron 你能澄清一下你是否可以改变GetSymbolicLinkTarget的功能吗? 当然,您了解 GetSymbolicLinkTarget 以及argv[1] 是什么意思? (这是字符串数组中的 second 条目。) 【参考方案1】:

主要问题是GetSymbolicLinkTarget的第一个参数的类型是char* []——一个指向char的指针数组。

&str 的类型是 char (*)[1000]——指向 1000 个字符的数组的指针。

这就是编译器告诉你的不匹配。

您可以使用多种方式解决它:

选项 1

更改GetSymbolicLinkTarget的第一个参数的类型。

int GetSymbolicLinkTarget(char *argv, char *buf, size_t buf_size)

这将需要更改函数中 argv 的使用方式。

然后,您可以使用:

GetSymbolicLinkTarget(str2, bufTest, sizeof(bufTest));

选项 2

更改GetSymbolicLinkTarget的第一个参数的类型。

int GetSymbolicLinkTarget(char (*)argv[1000], char *buf, size_t buf_size)

这还需要更改函数中argv 的使用方式。

然后,你可以使用:

GetSymbolicLinkTarget(&str2, bufTest, sizeof(bufTest));

选项 3

在调用函数中使用包装变量。

char* argv[2] = 0;
argv[1] = str2;
GetSymbolicLinkTarget(argv, bufTest, sizeof(bufTest));

这不需要对函数中argv 的使用方式进行任何更改。

【讨论】:

【参考方案2】:
int GetSymbolicLinkTarget(char *argv[], char *buf, size_t buf_size)
    int count = readlink(argv[1], buf, buf_size);
    if (count >= 0) 
        buf[count] = '\0';
    
    return count;

很奇怪。此函数将字符串数组作为其第一个参数,然后仅查看第二个参数。所以让我们创建一个字符串数组,我们希望它查看的字符串是第二个:

...
char* p[2];
p[1] = bufTest;
GetSymbolicLinkTarget(p, ...);

然后就可以了。 GetSymbolicLinkTarget 是这样工作的,这很奇怪,但你必须按照它的期望来调用它。

【讨论】:

或者只是将函数更改为接受单个char *,因为它只使用一个。 const char * 这样您就不会在调用者无法传递完全合理的参数时惹恼他们。 您正确地将GetSymbolicLinkTarget() 检测为“奇怪”,然后发布了一个解决方案,从而促进了这种奇怪。 GetSymbolicLinkTarget() 绝对应该更新以接受正确类型的参数。 @MateuszGrzejek 回答 OP 提出的问题还是他们应该提出的问题总是一个微妙的决定。 我应该问什么?

以上是关于无法将 char (*)[1000] 转换为 char **的主要内容,如果未能解决你的问题,请参考以下文章

C++CString转换为const char *类型

java中int怎样转换成char

error C2664: “int CWnd::GetWindowTextW(LPTSTR,int) const”: 不能将参数 1 从“char [10]”转换为“LP

double和char之间怎样转换?谢谢!

首字母大写驼峰名字转换

Qt中Qstring,char,int,QByteArray之间到转换(转)