Eingabewert von strtok..



  • Hallo,
    ich hab zwar ein bisschen rumgegoogelt und in den Referenzen geschaut, aber wirklich draufgekommen bin ich nicht.

    char *ausgabe[3];
            char *eingabe = "das ist geil";
    
            ausgabe[0] = strtok(eingabe, "s");
            ausgabe[1] = strtok(NULL, "s");
            ausgabe[2] = strtok(NULL, "i");
    

    => Segmentation Fault bei strtok

    char *ausgabe[3];
            char eingabe[] = "das ist geil";
    
            ausgabe[0] = strtok(eingabe, "s");
            ausgabe[1] = strtok(NULL, "s");
            ausgabe[2] = strtok(NULL, "i");
    

    => Works... Was ist da der Unterschied, ob ich ein char *xx oder char xx[] definiere?



  • Das ist beides ziemlich kreuzfalsch ... kommst Du drauf, warum?

    Du legst char *zeiger[3] an.

    Was tust Du denn damit? Wenn irgendwas danach nicht crasht, ist das nur Zufall.



  • Ich denke mal

    char string[] = "Das ist ein veraenderbarer String";
    

    liegt auf dem Stack und ist veränderbar, und

    char *string = "Das ist ein konstanter String";
    

    ist ein Pointer auf einen String im nicht veränderbaren Speicherbereich, deshalb bekommst Du auch eine Zugriffsverletzung.



  • Auf char *string="Text" darfst du in dem Fall nur lesend zugreifen.
    Bei char string[]="Text" kannst auch schreibend zugreifen.

    strtok greift schreibend zu, da es statt dem Trennzeichen ein 0byte einfügt. Daher crasht Variante 1 und Variante 2 nicht.



  • char *c1="text1", c2[]="text1";
    char *c3="text2", c4[]="text2";
    printf("%p -- %p", c1, c2);
    printf("\n%p -- %p", c3, c4);

    Probier das mal aus, dann siehst du dass *c in einem ganz anderen Speicherbereich wie c[] liegt.

    *c liegt im Datenbereich des ausführbaren Programms, während c[] am Stack angelegt wird.


Anmelden zum Antworten