【问题标题】:cannot convert char (*)[1000] to char **无法将 char (*)[1000] 转换为 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 条目。)

标签: c++ c string pointers char


【解决方案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 提出的问题还是他们应该提出的问题总是一个微妙的决定。
    • 我应该问什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    相关资源
    最近更新 更多