При инициализации отбрасываются квалификаторы из целевого типа указателя - PullRequest
34 голосов
/ 23 февраля 2010

Я пытаюсь распечатать список односвязных списков, на которые ссылался текст ссылки Это работает, но я получаю предупреждения компилятора:

Initialization discards qualifiers from pointer target type

(при объявлении start = head) и

return discards qualifiers from pointer target type

(в операторе возврата) в этом коде:

/* Prints singly linked list and returns head pointer */
LIST *PrintList(const LIST *head) 
{
    LIST *start = head;

    for (; start != NULL; start = start->next)
        printf("%15s %d ea\n", head->str, head->count);

    return head;
}

Я использую XCode. Есть мысли?

Ответы [ 2 ]

68 голосов
/ 23 февраля 2010

Вот эта часть:

LIST *start = head;

Параметром для функции является указатель на постоянную, const LIST *head;это означает, что вы не можете изменить то, на что оно указывает.Тем не менее, указатель выше является неконстантным;Вы можете разыменовать его и изменить его.

Также должно быть const:

const LIST *start = head;

То же самое относится и к вашему типу возврата.


Все, что говорит компилятор: «Эй, вы сказали вызывающей стороне:« Я ничего не изменю », но вы открываете возможности для этого».

21 голосов
/ 27 мая 2013

В следующей функции получит предупреждение, с которым вы столкнулись.

void test(const char *str) {
  char *s = str;
}

Есть 3 варианта:

  1. Удалить модификатор const параметра:

    void test(char *str) {
      char *s = str;
    }
    
  2. Объявите целевую переменную также как const:

    void test(const char *str) {
      const char *s = str;
    }
    
  3. Используйте тип преобразования:

    void test(const char *str) {
      char *s = (char *)str;
    }
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...