2014-10-06 4 views
0

Итак, у меня есть библиотечная функция, которая принимает const char ** как один из его параметров для представления массива char * s.Передача массива char * [] в функцию, которая принимает параметр const 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

Какая личность нужна? Просто (const)? – user1782677

+0

Возможно, вы забыли прототип функции или включили файл .h перед вызовом 'libraryFunc'. http://codepad.org/cpUUPJKR – humodz

ответ

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

+0

Должно быть, как я написал это в своем ответе. Ваша вторая альтернатива не ошибается, просто лишняя, неидиоматическая и многословная. В этом контексте 'stringArray' неявно преобразуется в указатель на свой первый элемент. И, кстати, 'stringArray' является зарезервированным идентификатором в C, вы должны называть ваш массив чем-то другим. То же самое касается 'string1' и' string2'. –

+0

Спасибо. Я на самом деле не называю их «stringArray» и «string1» в моем коде.Я просто изменил имена моих переменных ради этого вопроса. – user1782677

0

Это потому, что вы пытаетесь передать

char* - a pointer 

в

const char** - pointer to pointer to 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

+0

Нет, если вы скомпилируете под «C99 strict», хотя -> http://ideone.com/7KxSSg –

+0

@PaulGriffiths all right sir – 4pie0

Смежные вопросы