2014-10-06 38 views
0

因此,我有一个库函数,它接受一个const char **作为其参数之一来表示一个char *数组。传递一个char * []数组到一个函数,该函数使用参数const char **

void libraryFunc(const char ** parameter); 

所以我在做什么目前是这样的(全部用C BTW):

char *string1 = "myString"; 
char *string2 = "myString2"; 
char *stringArray[2] = { string1, string2 }; 
libraryFunc(&stringArray[0]); 

^这导致一个编译器错误说: “没有相应地调用libraryFunc”。我也试过以下内容:

libraryFunc(stringArray); 
libraryFunc(&stringArray); 

似乎无法弄清楚。

+0

我需要什么类型的演员?只是(const)? – user1782677 2014-10-06 00:47:25

+0

在调用'libraryFunc'之前,您可能忘记了函数原型或包含.h文件。 http://codepad.org/cpUUPJKR – humodz 2014-10-06 01:10:01

回答

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 *,因为它位于间接的第一级,所以很好)。 This question from the comp.lang.c FAQ进一步详细了解它为什么这样工作。

+0

所以应该是libraryFunc((const char **)stringArray)或libraryFunc((const char **)&stringArray [0])? – user1782677 2014-10-06 00:58:13

+0

它应该是我在答案中写的。你的第二个选择是没有错的,只是不必要的,非惯用的和冗长的。在此上下文中,'stringArray'会自动转换为指向其第一个元素的指针。顺便说一句,'stringArray'是C中的一个保留标识符,你应该调用你的数组。 'string1'和'string2'也一样。 – 2014-10-06 01:01:12

+0

谢谢。我实际上并没有在我的代码中调用它们“stringArray”和“string1”。为了这个问题,我只是更改了变量的名称。 – user1782677 2014-10-06 01:17:07

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

+0

它编译然而在ideone上:http://ideone.com/Fi4qgP – 4pie0 2014-10-06 01:06:12

+0

不,如果你编译在“C99严格”,但 - > http://ideone.com/7KxSSg – 2014-10-06 01:09:57

+0

@PaulGriffiths所有权先生 – 4pie0 2014-10-06 01:11:33

相关问题