Ответ 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 **
aconst char **
. (Компилятор должен жаловаться.) В строке 4 мы присваиваемconst char *
aconst char *
; это явно легально. В строке 5 мы модифицируем то, что указывает achar *
- это должно быть законным. Однакоp1
заканчивается, указывая наc
, который равенconst
. Это произошло в строке 4, потому что*p2
был действительноp1
. Это было настроено в строке 3, которая является назначением формы, которая запрещена, и именно поэтому строка 3 запрещена.Назначение
char **
aconst char **
(как в строке 3, так и в исходном вопросе) не является непосредственной опасностью. Но он устанавливает ситуацию, в которойp2
обещает, что значение в конечном счете не будет изменено - не может быть сохранено.