Почему это не нормально передать `char **` функции, которая принимает `const char **` в C?

Возможный дубликат:
Почему я могу конвертировать & lsquo; char ** & rsquo; к константе char * const * & rsquo; в C?

Мне любопытно, почему я не могу передать функцию char ** to const char **? Где, как это нормально, передать char * в функцию const char *, кажется, не все нормально делать это с помощью двух указателей. Я думал, что всегда можно добавить константу (но не так, чтобы отбросить константу), но теперь кажется, что я ошибался.

Компилятор Gcc дает мне ошибку:

note: expected ‘const char **’ but argument is of type ‘char **’

Вот фрагмент кода:

int f(const char **a) { }

int main() {
    char *a;
    f(&a);
}

Любые идеи?

Ответы

Ответ 1

Потому что компилятор не может гарантировать безопасность.

См. Q11.10 из comp.lang.c FAQ: Почему я не могу передать char ** функции, которая ожидает const char **?

предположим, что вы выполнили следующую более сложную серию Назначение:

const char c = 'x';    /* 1 */
char *p1;              /* 2 */
const char **p2 = &p1; /* 3 */
*p2 = &c;              /* 4 */
*p1 = 'X';             /* 5 */

В строке 3 мы присваиваем a char ** a const char **. (Компилятор должен жаловаться.) В строке 4 мы присваиваем const char * a const char *; это явно легально. В строке 5 мы модифицируем то, что указывает a char * - это должно быть законным. Однако p1 заканчивается, указывая на c, который равен const. Это произошло в строке 4, потому что *p2 был действительно p1. Это было настроено в строке 3, которая является назначением формы, которая запрещена, и именно поэтому строка 3 запрещена.

Назначение char ** a const char ** (как в строке 3, так и в исходном вопросе) не является непосредственной опасностью. Но он устанавливает ситуацию, в которой p2 обещает, что значение в конечном счете не будет изменено - не может быть сохранено.