плохой вызов с подписью const в C [дубликат]

Возможные Дубликаты:
почему это не законно конвертировать (указатель на указатель на non-const) в a (указатель на указатель на const)

почему я получаю предупреждение (gcc 42.2) со следующим вызовом foo?

void foo(const char **str)
{
  (*str)++;  
}

(...)
char **str;
foo(str);
(...)

Я понимаю, почему мы не можем вызвать функцию, исключая char ** С const char **, но мне кажется, что все в порядке, так почему следующее предупреждение?

warning: passing argument 1 of 'foo' from incompatible pointer type

1 ответов


это неправильно. Здесь нет реальной возможности спорить с компилятором, так как он поддерживается спецификацией. Вот пример, который точно объясняет, почему это неправильно:

void func(const char **p)
{
    *p = "abc";
}

void func2(void)
{
    char *a;
    func(&a);
    *a = 'x';
}

если компилятор не выплюнул ошибку, ваша программа, вероятно, сбой, потому что вы перезаписываете строковый литерал (который часто помечается только для чтения в памяти).

так нельзя беспрекословно char ** to const char ** потому что это позволит вам удалить const квалификатор из любого значения - в основном, это позволит вам игнорировать const без явного приведения.

основная причина, по которой компилятор дает предупреждение вместо ошибки, заключается в том, что много старого кода не использует const квалификатор, где это было бы, если бы код был написан сегодня.