所以我有一个库函数,它接受一个const char **作为它的一个参数来表示一个char *的数组。
void libraryFunc(const char ** parameter);
所以我现在所做的就是这个(全部用C顺便说一下):
char *string1 = "myString";
char *string2 = "myString2";
char *stringArray[2] = { string1, string2 };
libraryFunc(&stringArray[0]);
^这导致编译器错误,说“没有匹配的对libraryFunc的调用”。我也尝试了以下内容:
libraryFunc(stringArray);
libraryFunc(&stringArray);
似乎无法弄明白。
答案 0 :(得分:0)
这是因为你试图传递
char* - a pointer
到
const char** - pointer to pointer to const char
使用const是一个契约,你不能通过两个指针的间接来满足这个契约。这是因为否则你总是可以改变这个const char应用程序(这是从C ++标准,我的评论):
const char c = 'c';
char* pc;
const char** pcc = &pc; // not allowed (thankfully!)
^^^ here the bundit is hidden under const: "I will not modify"
*pcc = &c; // *pcc is "pointer to const" right? so this is allowed...
*pc = 'C'; // would allow to modify a const object, *pc is char right?
有关详细信息,您可以按照我对类似主题的其他答案: https://stackoverflow.com/a/16390371/1141471
在线代码:
答案 1 :(得分:0)
你可以投了它:
libraryFunc( (const char **) stringArray);
或者,最好只更改数组的声明:
char *string1 = "myString";
char *string2 = "myString2";
const char *stringArray[2] = { string1, string2 };
libraryFunc(stringArray);
您无法隐式地将char **
转换为const char **
,因为这仅适用于间接的第一级(请注意上面的第二个摘录中隐含地将char *
转换为const char *
{{1}},因为它处于第一级间接,所以很好)。 This question from the comp.lang.c FAQ详细介绍了为什么它以这种方式工作。