Потому что компилятор не может гарантировать безопасность.
См. Q11.10 из FAQ по comp.lang.c: Почему я не могу передать char **
в функцию, которая ожидает const char **
?
Предположим, что вы выполнили следующую более сложную серию присваиваний:
const char c = 'x'; /* 1 */ char *p1; /* 2 */ const char **p2 = &p1; /* 3 */ *p2 = &c; /* 4 */ *p1 = 'X'; /* 5 */
В строке 3 мы присваиваем
char **
кconst char **
. (Компилятор должен пожаловаться.) В строке 4 мы присваиваемconst char *
кconst char *
; это явно законно. В строке 5 мы изменяем то, на что указываетchar *
- это должно быть законно. Однакоp1
в итоге указывает наc
, который являетсяconst
. Это произошло в строке 4, потому что*p2
на самом деле былоp1
. Это было установлено в строке 3, которая является присвоением формы, которая запрещена, и именно поэтому строка 3 запрещена.Присвоение
char **
кconst char **
(как в строке 3 и в исходном вопросе) не представляет непосредственной опасности. Но это создает ситуацию, в которой обещаниеp2
- что конечное значение, на которое указывается, не будет изменено - не может быть выполнено.