const char * арифметическое предупреждение указателя - PullRequest
1 голос
/ 23 мая 2011

С моим компилятором (Apple llvm-gg-4.2) этот код:

void fun1(const char *s)
{
    char* t = s+1;
}
void fun2(char *s)
{
    char* t = s+1;
}

int main(void)
{
    char* a;
    fun1(a);
    fun2(a);
}

выдает это предупреждение:

junk.c: 3: warning: инициализация отбрасывает квалификаторы из цели указателявведите

на fun1, но не на fun2.Почему?

Ответы [ 3 ]

4 голосов
/ 23 мая 2011

fun1 принимает const char * и присваивается char *
Принимая во внимание, что fun2 принимает char * и присваивается char *, что хорошо.

If you are assigning a constant pointer to a non-const pointer, this means you can modify the const pointer by using the const pointer

В этом случае, внутри fun1, если вы делаете t[0] = 'a', это недопустимо, потому что вы изменяете память const, поэтому компилятор предупреждает вас

3 голосов
/ 23 мая 2011

Причина, по которой в fun1 вы конвертируете const char * в char *.Это приводит к потере квалификатора const и открытию двери для изменения данных, которые функция, вероятно, не собиралась изменять.

Чтобы исправить это, измените тело fun1 на

const char* t = s+1;
3 голосов
/ 23 мая 2011

В fun1, s - это const char *. Когда вы делаете char* t = s+1;, вы «удаляете» этот статус const из s. Отсюда и «отбрасывает квалификаторы». Если бы это был C ++, вы получите ошибку компилятора вместо предупреждения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...