Die Initialisierung verwirft Qualifizierer vom Zeigerzieltyp

Lesezeit: 2 Minuten

Benutzeravatar von Crystal
Kristall

Ich versuche, die Liste einer einfach verknüpften Liste zu drucken, auf die ich im Linktext verwiesen habe. Es funktioniert, aber ich bekomme die Compiler-Warnungen:

Initialization discards qualifiers from pointer target type

(bei Starterklärung = Kopf) und

return discards qualifiers from pointer target type

(on return-Anweisung) in diesem 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;
}

Ich verwende XCode. Irgendwelche Gedanken?

  • Nur zu Ihrer Information, ich habe gcc nicht identifizierte Warnungen wie diese drucken lassen, von denen ich glaube, dass sie kontrolliert werden -Wwrite-strings. Es gibt -Wdiscarded-qualifiers, -Wcast-qual und klang -Wincompatible-pointer-types-discards-qualifiers die auch verwandt aussehen.

    – jozxyqk

    5. Oktober 2018 um 23:00 Uhr

Benutzeravatar von GManNickG
GManNickG

Es ist dieser Teil:

LIST *start = head;

Der Parameter für die Funktion ist ein Zeiger auf eine Konstante, const LIST *head; Das bedeutet, dass Sie nicht ändern können, worauf es zeigt. Der obige Zeiger ist jedoch nicht konstant; Sie könnten es dereferenzieren und ändern.

Es muss sein const auch:

const LIST *start = head;

Gleiches gilt für Ihren Rückgabetyp.


Der Compiler sagt nur: “Hey, du hast zum Anrufer gesagt ‘Ich werde nichts ändern’, aber du eröffnest Möglichkeiten dafür.”

  • Dumme Frage, aber wie sieht ein konstanter Rückgabetyp aus? Ich habe versucht, im Internet zu suchen, und ich kann anscheinend keinen finden.

    – Kristall

    23. Februar 2010 um 6:00 Uhr

  • @Kristall – const LIST *PrintList(const LIST *head) { ... }

    – R. Samuel Klatschko

    23. Februar 2010 um 7:42 Uhr

  • The parameter for the function is a constant pointer – falsch. const LIST *head deklariert head als Zeiger auf eine Konstante LIST. Sehen: c-faq.com/decl/constparm.html — vielleicht ist das nur ein Missverständnis in der Formulierung.

    – CivFan

    17. September 2015 um 17:48 Uhr


  • Ich liebe es, wenn es in natürlicher Sprache erklärt wird, als ob der Compiler sprechen könnte. Tolle Erklärung!

    – Zimano

    27. Oktober 2015 um 9:38 Uhr

Benutzeravatar von Eric
Erich

In der folgenden Funktion erhalten Sie die Warnung, auf die Sie gestoßen sind.

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

Es gibt 3 Möglichkeiten:

  1. Entfernen Sie den const-Modifikator von param:

    void test(char *str) {
      char *s = str;
    }
    
  2. Deklarieren Sie die Zielvariable auch als const:

    void test(const char *str) {
      const char *s = str;
    }
    
  3. Verwenden Sie eine Typkonvertierung:

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

1409060cookie-checkDie Initialisierung verwirft Qualifizierer vom Zeigerzieltyp

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy