C environment

Gast #1327378
Lesenswert?

Hallo,
1
int main()
2
int main(int argc)
3
int main(int argc, char ** argv)

Diese Varianten gibt es.

Aufrufzeile "progname 1 2 3"

Wie sieht argv nun intern im Speicher aus?

argv     -> "progname"
argv + 1 -> "1"
argv + 2 -> "2"
argv + 3 -> "3"
argv + 4 -> ??? 0 oder keine 0

while((char *msg = argv++))
    std::cout << msg << std::endl;

andererseits, wenn das so wäre, dann bräuchte man argc Zähler nicht.

Ich finde nicht ob C Standard dazu Stellung bezieht.

Gruss
#1327388
Lesenswert?

Daniel schrieb:
> Wie sieht argv nun intern im Speicher aus?
>
> argv     -> "progname"
> argv + 1 -> "1"
> argv + 2 -> "2"
> argv + 3 -> "3"
> argv + 4 -> ??? 0 oder keine 0

0

>
> while((char *msg = argv++))
>     std::cout << msg << std::endl;
>
> andererseits, wenn das so wäre, dann bräuchte man argc Zähler nicht.

argc ermöglicht dir auch die alternative Form zu benutzen
1
    for( i = 0; i < argc; ++i )
2
      mach_was_mit( argv[i] );

Das ist das eine. Das andere ist, dass dir argc eine schnelle Prüfung 
ermöglicht, ob genug Parameter angegeben wurden, bzw. darauf zu 
reagieren.
1
int main( int argc, char* argv[] )
2
{
3
  if( argc == 1 ) {
4
    printf( "Not enough parameters\n" );
5
    showHelp();
6
    return EXIT_FAILURE;
7
  }
8

9
  ...
Gast #1327418
Lesenswert?

Aus dem Standard:

  5.1.2.2.1 Program startup
  ...
  If they are declared, the parameters to the main function shall obey
  the following constraints:

  — The value of argc shall be nonnegative.

  — argv[argc] shall be a null pointer.
  ...
Gast #1327448
Lesenswert?

— argv[argc] shall be a null pointer.

Danke.
Ich hatte irgendwie einen segfault gehabt. Und jetzt wieder nicht.

Oben hatte ich einen Fehler drin.
So muss es sein.
1
char * msg;
2
while((msg = *argv++))
3
    std::cout << msg << std::endl;

Wenn die 0 vorgeschrieben ist, dann braucht man auf argc gar
nicht zurückzugreifen.

Gruss, Daniel
#1327462
Lesenswert?

yalu schrieb:
> Aus dem Standard:
>
>   5.1.2.2.1 Program startup
>   ...
>   If they are declared, the parameters to the main function shall obey
>   the following constraints:
>
>   — The value of argc shall be nonnegative.
>
>   — argv[argc] shall be a null pointer.
>   ...

Das ist C99?

Dann stellt sich die Frage, wer von welchem Standard redet.
Das ist halt das schöne an Standards...
Gast #1327466
Lesenswert?

> Das ist C99?

Ja, war aber schon immer so in C.

> Dann stellt sich die Frage, wer von welchem Standard redet.
> Das ist halt das schöne an Standards...

C99 ist aber kein Standard, sondern eine Norm.
(Im Gegensatz zu C89 übrigens)
Gast #1327919
Lesenswert?

> int main()
> int main(int argc)

Diese Variante ist nicht vorgeschrieben, aber auch nicht verboten.

> int main(int argc, char ** argv)

> Das Environment als dritten Parameter:
>
> int main (int argc, char * argv[], char * envp)
>
> Geht aber möglicherweise nur mit GNU-C

Die ist nach ISO C ebenfalls nicht vorgesehen, aber auch nicht verboten.


>>— argv[argc] shall be a null pointer.
>
> Man beachte das "shall" -> Weiche Anforderung. muß nicht erfüllt
> werden

Unsinn.  Da steht "shall", nicht "should".
Davon abgesehen ist der Begriff "shall" in der ISO-Norm ebenfalls 
definiert:

In this International Standard, ‘‘shall’’ is to be interpreted as a 
requirement on an implementation or on a program; conversely, ‘‘shall
not’’ is to be interpreted as a prohibition.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren