Hallo,
ich habe folgenden Test durchgeführt - ein Programm, dass mir alle Buchstaben aller Kommandozeilenargumente ausgibt (damit wollte ich den Zugriff auf die Werte von Zeigern auf Zeigern testen).
#include <stdio.h>
int main(int argc, char *argv[0]) {
int c;
printf("Alle Zeichen der Argumente einzeln ausgeben...\n");
while (argc-- > 0) {
while (*argv) {
while ( (c = *(*(argv))++ ) != '\0') {
printf("%c\n", c);
}
*argv++;
}
}
return 0;
}
Das Programm funktioniert. Aufzurufen zB mit: ./ArgumenteKommandozeile test1 test2 test3
Ich schrieb intuitiv "while (*argv)". Aber was genau bedeutet das technisch, bzw warum funktioniert das so. argv ist ein Array von Zeigern, eigentlich die Adresse des ersten Elements des ersten Zeigers, wenn ich mich nicht irre. Wenn keine Kommandozeilenargumente mehr vorhanden sind, zeigt der Zeiger ja theoretisch irgendwohin. Für das Programm wäre das ja eigentlich kein Grund dort zu stoppen, denn vielleicht will ich ja auf irgend eine Speicherstelle "nach dem (Zeiger-)Array" zeigen, aber das Programm weiß trotzdem, dass es dort stoppen muss. Wieso?
Ich glaube, dass ich hier momentan nämlich ganz böse auf der Leitung stehe.
Weiters ist mir eines auch nicht ganz klar. Statt *(*(argv))++ kann ich nicht **argv++ schreiben, da ich sonst ein Segmentation fault bekomme, aber wieso ist das so? Denn schließlich müsste der Compiler ja wissen, dass ich einen Zeiger auf einen Zeiger habe (**) und somit den "tiefsten" Zeiger inkrementieren will, wenn ich **zgr++ schreibe. Aber offensichtlich ist es nicht so, nur warum?
Markus