Sind char * argv[] Argumente in main null beendet?
Lesezeit: 3 Minuten
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?
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
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.
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.
14095400cookie-checkSind char * argv[] Argumente in main null beendet?yes
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