Es scheint, dass das argv[argc]
immer NULL
so ist , also denke ich, dass wir die Argumentliste ohne durchlaufen können argc
. Eine einzelne while
Schleife wird dies tun.
Wenn es NULL
am Ende immer eine gibt argv
, warum brauchen wir dann eine argc
?
int argc(char *argv[])
die genau dies tun :-))"\0"
ist nicht dasselbe wie der NULL-Zeiger (0
entspricht NULL in C ++)Antworten:
Ja,
argv[argc]==NULL
ist garantiert. Siehe C11 5.1.2.2.1 Programmstart (mein Schwerpunkt)Das Bereitstellen ist
argc
daher nicht wichtig, aber dennoch nützlich. Dies ermöglicht unter anderem eine schnelle Überprüfung, ob die richtige Anzahl von Argumenten übergeben wurde.Bearbeiten: Die Frage wurde geändert, um C ++ einzuschließen. n3337 Entwurf 3.6.1 Hauptfunktion sagt
quelle
argc
könnte ziemlich groß sein, da die Shell Erweiterung tut (so inls *
dem*
von der Shell vor erweitert wirdexecve
von/bin/ls
ausführbaren). Auf meinem System kann ichargc
mehrere hunderttausend haben.argc
ausreichend gehalten habe, aber ich kann mir definitiv Situationen vorstellen, in denen diese Garantie relevant und sogar erforderlich wäre. +1argc
und ganz zu, das war und ist eine gute Sache.Ja,
argv[argc]
ist garantiert ein Nullzeiger.argc
wird der Einfachheit halber verwendet.Beachten Sie unter Angabe der offiziellen Erklärung aus C99 Rationale die Worte redundante Prüfung :
quelle
Es ist aus historischen Gründen und Kompatibilität mit altem Code. Ursprünglich gab es keine Garantie dafür, dass ein Nullzeiger als letztes Element des argv-Arrays vorhanden sein würde. Aber argc hat es immer gegeben.
quelle
int main(char *argv[], int argc, ...)
, könnten einige Programme das einfach weglassen,argc
weil sie es nicht brauchen. Das Gegenteil (brauchen,argc
aber nichtargv
) ist in einem echten Programm wahrscheinlich nie nützlich.Wir "brauchen" es, weil es von verschiedenen Standards verlangt wird.
Es steht uns frei, den Wert vollständig zu ignorieren, aber da er der erste Parameter von ist
main
, müssen wir ihn in der Parameterliste haben. In C ++ (und wahrscheinlich nicht standardmäßigen C-Dialekten) können Sie den Parameternamen einfach weglassen, wie in diesem C ++ - Snippet (einfach in C zu konvertieren):In Standard C mit allgemeinen Warneinstellungen generiert ein nicht verwendeter Parameter eine Warnung, die durch eine Anweisung behoben werden kann, mit
(void)argc;
der der Name verwendet wird, ohne dass Code generiert wird.argc
ist schön zu haben, weil sonst viele Programme die Parameter durchlaufen müssten, um die Zählung zu erhalten. Außerdem gibt es in vielen Programmiersprachen mit Arrays mit Länge keinenargc
Parameter, sondern nur ein Array mit den Elementen.quelle