Sind char * argv[] Argumente in main null beendet?

Lesezeit: 3 Minuten

Benutzeravatar von LeviX
LeviX

Ich frage mich also, ob Befehlszeilenparameter immer nullterminiert sind? Google scheint ja zu sagen, und das Kompilieren auf GCC zeigt an, dass dies der Fall ist, aber kann ich garantieren, dass dies immer wahr ist?

int main(int argc, char** argv)
{
    char *p;

    for(int cnt=1; cnt < argc; ++cnt)
    {
        p = argv[cnt];
        printf("%d = [%s]\n", cnt, p);
    }
    return 0;
}

$ MyProgram -arg1 -arg2 -arg3
1 = -arg1
2 = -arg2
3 = -arg3

  • Denken Sie eine Minute nach: Was würde passieren, wenn sie nicht NULL-terminiert wären?

    – Benutzer703016

    13. Juni 2012 um 17:29 Uhr


  • Nachdenken für eine Minute… Char[] und char* impliziert nicht automatisch einen String im C-Stil. Offensichtlich ist die gesamte Befehlszeilenzeichenfolge NULL-terminiert, aber das muss nicht in jedes einzelne Array von Zeichen übersetzt werden, die auf der Befehlszeile übergeben werden und NULL-terminiert sind. Es wäre einfach genug für argv, einfach die Leerzeichen in der Befehlszeile zu entfernen und Zeichen-Arrays ohne Null und keine Zeichenfolgen im C-Stil zu haben.

    – LeviX

    14. Juni 2012 um 16:12 Uhr


  • @LeviX – Wenn die Zeichenarrays nicht NULL-terminiert wären, wie könnten Sie das Ende des Zeichenarrays erkennen?

    – shf301

    14. Juni 2012 um 16:20 Uhr

  • @ shf301 Ahh, ok, ich verstehe deinen Punkt. Zeichen* argv[]. Wenn sie nicht nullterminiert sind, woher wissen Sie, wo einer beginnt und der andere im 2D-Array beginnt. Verstanden, ich stehe korrigiert, das macht jetzt Sinn. Vielen Dank.

    – LeviX

    14. Juni 2012 um 17:37 Uhr

  • @LeviX Es geht darum zu wissen, wo jeder String endet und ihn an jede andere C-Funktion weitergeben zu können, die einen NUL-Terminator erwartet. Es hat nichts damit zu tun, dass die Strings in einem Array sind. Ein Array wie char* argv[] ist kein 2D-Array; es ist ein Array von Zeigern. (Sicherlich müssten in einem echten 2D-Array alle Strings die gleiche Länge haben, also bräuchten wir keinen Terminator?) Die Objekte, auf die gezeigt wird, müssen nicht nebeneinander liegen. Das heißt: Hier ist es nicht erforderlich, dass die Adresse, auf die jeder nachfolgende Zeiger zeigt, 1 Byte nach der NUL sein muss, die das zuvor nummerierte Argument beendet.

    – Unterstrich_d

    27. September 2017 um 21:00 Uhr


Benutzeravatar von James McNellis
James McNellis

Ja. Die Nicht-Null-Zeiger in der argv Array zeigen auf C-Strings, die per Definition nullterminiert sind.

Der C-Sprachstandard besagt einfach, dass die Array-Mitglieder “Zeiger auf Zeichenfolgen enthalten müssen” (C99 §5.1.2.2.1/2). Eine Zeichenfolge ist “eine zusammenhängende Folge von Zeichen, die durch das erste Nullzeichen abgeschlossen wird und dieses enthält” (C99 §7.1.1/1), das heißt, sie sind per Definition nullterminiert.

Weiterhin das Array-Element at argv[argc] ist ein Nullzeiger, also ist das Array selbst in gewissem Sinne auch “nullterminiert”.

  • Können Sie die Verwendung von argc erklären, wenn argv nullterminiert ist. Können wir nicht erkennen, nein. von Argumenten, indem das Array durchlaufen wird, bis ‘\0’ erreicht ist.. ?

    – Snehasisch

    30. August 2015 um 19:53 Uhr

  • @Snehasish Ja, du kannst berechnen argc aus argv. Warum main hat die Signatur, die es hat, weiß ich nicht genau. Das war schon so, bevor es mich gab.

    – James McNellis

    31. August 2015 um 1:30 Uhr


  • @Snehasish: Nur zum Spaß habe ich diese Frage zu Retrocomputing SE gestellt – es ist ein Überbleibsel aus Pre-ANSI C: retrocomputing.stackexchange.com/questions/5179/…

    – tonysdg

    14. Dezember 2017 um 16:18 Uhr

  • Nur das letzte Element des Arrays ist ein Nullzeiger, aber Sie können es haben argc == 0 (obwohl dies äußerst selten vorkommt und eine sorgfältige Einrichtung erfordert), sodass die Argumentliste keine Zeichenfolgen enthält. Wenn der Befehlsname nicht verfügbar ist, aber andere Argumente vorhanden sind, schreibt der Standard dies vor argv[0] soll ein leerer String sein, kein Nullzeiger.

    – Jonathan Leffler

    11. Juli 2019 um 22:25 Uhr

Ja, es ist immer wahr, dass die Argumente nullterminierte Zeichenfolgen sind.

1409540cookie-checkSind char * argv[] Argumente in main null beendet?

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

Privacy policy