Инициализация отбрасывает квалификаторы из целевого типа указателя
Я пытаюсь распечатать список одного связанного списка, на который я ссылался в тексте ссылки. Он работает, но я получаю предупреждения компилятора:
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. Любые мысли?
Ответы
Ответ 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;
}