*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?


Anmelden zum Antworten