При инициализации отбрасываются квалификаторы из целевого типа указателя

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

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 ответа

Решение

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

LIST *start = head;

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

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

const LIST *start = head;

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


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

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

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. Используйте тип convert:

    void test(const char *str) {
      char *s = (char *)str;
    }
    
Другие вопросы по тегам