无法将 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 **的主要内容,如果未能解决你的问题,请参考以下文章
error C2664: “int CWnd::GetWindowTextW(LPTSTR,int) const”: 不能将参数 1 从“char [10]”转换为“LP