2010-02-23 2 views
31

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

Initialization discards qualifiers from pointer target type

(об объявлении старта = головы) и

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. Есть предположения?

ответ

65

Именно эта часть:

LIST *start = head; 

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

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

const LIST *start = head; 

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


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

+0

Тупой вопрос, но то, что делает константный тип возврата выглядеть? Я пробовал искать в Интернете, и я не могу найти его. – Crystal

+5

@Crystal - 'const LIST * PrintList (const LIST * head) {...}' –

+0

'Параметр для функции - постоянный указатель' - неверный. 'const LIST * head' объявляет голову указателем на постоянный LIST. См .: http://c-faq.com/decl/constparm.html - возможно, это просто недоразумение в формулировке. – CivFan

17

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

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

Есть 3 выбора:

  1. Удалите константный модификатор пар:

    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; 
    } 
    
Смежные вопросы