При инициализации отбрасываются квалификаторы из целевого типа указателя
Я пытаюсь напечатать список односвязных списков, на которые я ссылался в тексте ссылки. Это работает, но я получаю предупреждения компилятора:
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 варианта:
Удалите модификатор const параметра:
void test(char *str) { char *s = str; }
Объявите целевую переменную также как const:
void test(const char *str) { const char *s = str; }
Используйте тип convert:
void test(const char *str) { char *s = (char *)str; }