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

14
задан Community 23 May 2017 в 12:17
поделиться

1 ответ

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

См. 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 - что конечное значение, на которое указывается, не будет изменено - не может быть выполнено.

18
ответ дан 1 December 2019 в 13:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: