*zgr = *zgr; - oder wie?
-
...
-
Sry für die Verwirrung, aber mein Problem war dieses:
int main (int argc, char *arg[]) { int i; if (argc == 1) for (i=0; i<4; i++) printf(">%s...\n", arg[i]); }
Warum liefert arg[1] auch NULL zurück???
-
tito schrieb:
Sry für die Verwirrung, aber mein Problem war dieses:
int main (int argc, char *arg[]) { int i; if (argc == 1) for (i=0; i<4; i++) printf(">%s...\n", arg[i]); }
Warum liefert arg[1] auch NULL zurück???
Wenn argc == 1 ist, steht auch nur ein Argument zur Verfügung, nämlich der Programmname selbst.
Dann gibts auch kein arg[1] (also einen zweiten Parameter).Ein Zeiger wird z. B. char *ptr deklariert. Wenn Du dann ptr benutzt (ohne stern), dann
sprichst Du die Adresse an, auf die ptr zeigt. Wenn Du aber *ptr im Programm benutzt,
dann hast Du den Inhalt von der speicheradresse, auf die ptr (ohne Stern) zeigt.
Mit anderen Worten: wenn ptr ein Zeiger auf eine Kuh ist, ist *ptr die Kuh selbst ;).
-
thknopp schrieb:
Wenn argc == 1 ist, steht auch nur ein Argument zur Verfügung, nämlich der Programmname selbst.
Dann gibts auch kein arg[1] (also einen zweiten Parameter).Das ist richtig.
Aber wenn argc == 1 ist, warum liefert dann arg[1] NULL, arg[2] "" und arg[3] Absturz. Klar ist mir das ich bei arg[3] auf ein nicht dimensioniertes geschweige denn initalisiertes Objekt zugreifen wollte.
Doch sollte das nicht auch schon bei arg[1] der Fall sein, also arg1 Absturz.
Muss man das als Tatsache akzeptieren, oder steckt da ein Sinn hinter?
-
Du musst nur akzeptieren dass undefiniertes Verhalten nicht heisst dass ein Absturz stattfindet. Du kannst das Ergebnis einfach nicht vorhersagen. Deshalb vermeide es besser
-
Ich weiß nicht, ob das vom Standard so definiert wurde, aber laut MSDN ist das Absicht:
MSDN - main() schrieb:
argv
An array of null-terminated strings. It can be declared as an array of pointers to char (char *argv[ ]) or as a pointer to pointers to char (char **argv). The first string (argv[0]) is the program name, and each following string is an argument passed to the program from the command line. The last pointer (argv[argc]) is NULL.
-
Wenn ich doch aber in der shell PROGRAMM.EXE aufrufe: Habe ich doch keine parameter, ausser dem Programmnamen mit übergeben.
Also sollte doch auch kein arg[1] == NULL sein oder aber es wäre auch arg[n] == NULL. Das verstehe ich nicht.EDIT:
The last pointer (argv[argc]) is NULL.
- Erst gar nicht gesehen.
Also werde ich es wohl als Tatsache ansehen.
-
Laut Standard ist argv[0] bis argv[argc - 1] mit den Parametern gefüllt (einschließlich des Programmnamens). Darüber hinaus kannst Du keinerlei Annahmen treffen, finde dich damit ab. Will heissen in argv[argc], argv[argc + 1] ... argv[argc + n] kann ALLES drinstehen, und da hast Du keinerlei Einfluß drauf.
Oder verstehe ich die Frage falsch?!
-
tito schrieb:
Wenn ich doch aber in der shell PROGRAMM.EXE aufrufe: Habe ich doch keine parameter, ausser dem Programmnamen mit übergeben.
Also sollte doch auch kein arg[1] == NULL sein oder aber es wäre auch arg[n] == NULL. Das verstehe ich nicht.Wieso das? argv ist einfach ein Array von Zeigern, die hintereinander im Speicher stehen:
0 1 2 ... | NULL | | ... "PROGRAMM.EXE"
(die ersten Elemente werden vom Startup-Code belegt, alles dahinter enthält irgendwelche willkürlichen Werte)
-
LordJaxom schrieb:
Oder verstehe ich die Frage falsch?!
Nein schon richtig.
Habe mich schon damit abgefunden, tut ja nicht weh
Bis argv[argc-1] == PROGARG. ist ja logisch und ab argv[argc] alles als UNDEFIENIERT anzusehen aus Sicht des Programmes irgendwie auch.... btw: Braucht der Theard nun einen anderen Tietel?