web-dev-qa-db-fra.com

L'initialisation supprime les qualificatifs du type cible du pointeur

J'essaie d'imprimer la liste d'une liste liée individuellement à laquelle j'ai fait référence dans texte du lien . Cela fonctionne, mais j'obtiens les avertissements du compilateur:

Initialization discards qualifiers from pointer target type

(sur déclaration de départ = 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?

35
Crystal

C'est cette partie:

LIST *start = head;

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

Il doit également être const:

const LIST *start = head;

La même chose s'applique à votre type de retour.


Tout ce que le compilateur dit est: "Hé, vous avez dit à l'appelant" Je ne changerai rien ", mais vous ouvrez des opportunités pour cela."

69
GManNickG

Dans la fonction suivante, obtiendrait l'avertissement que vous avez rencontré avec.

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

Il y a 3 choix:

  1. Supprimez le modificateur const de param:

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

    void test(const char *str) {
      const char *s = str;
    }
    
  3. Utilisez une conversion de type:

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