2010-02-23 3 views
31

J'essaie d'imprimer la liste d'une liste à lien unique à laquelle j'ai fait référence dans link text. Il fonctionne, mais je reçois les avertissements du compilateur:L'initialisation supprime les qualificateurs du type cible de pointeur

Initialization discards qualifiers from pointer target type

(sur déclaration de début = tête) et

return discards qualifiers from pointer target type

(sur déclaration de retour) dans ce code:

/* 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; 
} 

J'utilise XCode. Des pensées?

Répondre

65

Il est cette partie:

LIST *start = head; 

Le paramètre de la fonction est un pointeur vers une constante, const LIST *head; Cela signifie que vous ne pouvez pas changer ce qu'il pointe vers. Cependant, le pointeur ci-dessus est à non-const; vous pourriez le déréférencer et le changer.

Il doit être const ainsi:

const LIST *start = head; 

de même pour votre type de retour.


Tout le compilateur dit est: « Hé, vous avez dit à l'appelant: « Je ne changerai rien », mais vous ouvrez des possibilités pour cela. »

+0

question Dumb, mais quoi ressemble un type de retour comme const? J'ai essayé de chercher sur le web, et je n'arrive pas à en trouver un. – Crystal

+5

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

+0

'Le paramètre de la fonction est un pointeur constant' - incorrect. 'const LIST * head' déclare la tête comme un pointeur vers une liste constante. Voir: http://c-faq.com/decl/constparm.html - c'est peut-être juste un malentendu dans le libellé. – CivFan

17

En fonction suivante vous obtiendrez l'avertissement que vous rencontrez avec

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

Il y a 3 choix:

  1. Retirez le modificateur const de param:

    void test(char *str) { 
        char *s = str; 
    } 
    
  2. Déclarez la variable cible également comme const:

    void test(const char *str) { 
        const char *s = str; 
    } 
    
  3. Utilisez un type convert:

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