Das Übergeben von Argument 1 verwirft Qualifizierer vom Zeigerzieltyp

Lesezeit: 2 Minuten

Benutzer-Avatar
Alex Nichols

Meine Hauptaufgabe ist folgende:

int main(int argc, char const *argv[])
{
    huffenc(argv[1]);
    return 0;
}

Der Compiler gibt die Warnung zurück:

huffenc.c:76: warning: passing argument 1 of ‘huffenc’ discards qualifiers from pointer target type

Als Referenz, huffenc nimmt ein char* Eingabe, und die Funktion wird ausgeführt, mit der Beispieleingabe “Sinnlosigkeit” via ./huffenc senselessness

Was könnte diese Warnung bedeuten?

  • Du sagst das huffenc nimmt ein char *aber du übergibst es a char const *

    – Oliver Charlesworth

    13. März 2013 um 23:37 Uhr

  • Definiere einfach main ohne die const.

    – teppisch

    13. März 2013 um 23:38 Uhr

  • Nun, Sie könnten, aber das ist unelegant (und potenziell gefährlich). Eine bessere Lösung ist, herauszufinden warum huffenc benötigt einen nicht konstanten Zeiger, und ändern Sie ihn nach Möglichkeit in const.

    – Oliver Charlesworth

    13. März 2013 um 23:39 Uhr

  • Das ist eine falsche Definition von main wie auch immer, machen Sie es einfach richtig, damit zu beginnen; int main(int argc, char *argv[]).

    – Ed S.

    13. März 2013 um 23:39 Uhr


  • @Kay: Nun, der Standard ist ziemlich klar, dass die Definition von main entweder ist int main(int argc, char *argv[]) oder int main(void). Das heißt es weiter “5.1.2.2.1 Programmstart: Die Parameter argc und argv und die Strings, auf die das argv-Array zeigt soll durch das Programm veränderbar sein…” Also, ich möchten nenne es falsch. Es wird natürlich funktionieren, aber warum? Wann hat eine der beiden Standarddefinitionen zu fehlerhaften Programmen geführt?

    – Ed S.

    13. März 2013 um 23:45 Uhr


Es bedeutet, dass Sie a passieren const Argument für eine Funktion, die ein Nicht-const Argument, das aus offensichtlichen Gründen potenziell schlecht ist.

huffenc braucht wahrscheinlich kein Nicht-const Argument, also sollte es ein dauern const char*. Allerdings ist Ihre Definition von main ist nicht genormt.

Der C99-Standard Abschnitt 5.1.2.2.1 (Programmstart) besagt:

Die beim Programmstart aufgerufene Funktion heißt main. Die Implementierung deklariert keinen Prototyp für diese Funktion. Es muss mit dem Rückgabetyp int und ohne Parameter definiert werden:

int main(void) { /* ... */ }

oder mit zwei Parametern (hier als argc und argv bezeichnet, obwohl beliebige Namen verwendet werden können, da sie lokal für die Funktion sind, in der sie deklariert sind):

int main(int argc, char *argv[]) { /* ... */ }

oder Äquivalent;9) oder auf eine andere implementierungsdefinierte Weise.

Und sagt weiter…

… Die Parameter argc und argv und die Strings, auf die das argv-Array zeigt soll durch das Programm veränderbar seinund behalten ihre zuletzt gespeicherten Werte zwischen Programmstart und Programmende bei.

1053570cookie-checkDas Übergeben von Argument 1 verwirft Qualifizierer vom Zeigerzieltyp

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

Privacy policy