将char * []数组传递给一个带参数const char **的函数

时间:2014-10-06 00:43:20

标签: c arrays pointers parameters char

所以我有一个库函数,它接受一个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);

似乎无法弄明白。

2 个答案:

答案 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

在线代码:

http://coliru.stacked-crooked.com/a/74392c59cfc3ef70

答案 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详细介绍了为什么它以这种方式工作。