Подтвердить что ты не робот

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

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

Initialization discards qualifiers from pointer target type

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

return discards qualifiers from pointer target type

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

/* 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. Любые мысли?

4b9b3361

Ответ 1

Эта часть:

LIST *start = head;

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

Он должен быть const:

const LIST *start = head;

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


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

Ответ 2

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

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

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

  • Удалить модификатор константы param:

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

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

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