strlen((const char*)23);



  • strlen((const char*)23);
    

    Warum stürzt dabei mein Programm ab?

    Ich weiß wie es richtig geht, (erst zahl in string wandeln), aber würde mich trotzdem interessieren.



  • 23 ist kein gültiger Char-string.



  • du machst dir nen zeiger auf speicheradresse nr. 23. dir wird idR nicht deinem Programm gehören. moderne dinger melden zugriffsverletzungen (strlen muss ja auf den speicher zugreifen)



  • std::string* ptr = NULL;
    ptr->assign("Hallo");
    


  • So ginge es auch:

    int main(int argc, char* argv[])
    {
    	char zeile[]="hallo welt";
    	cout<<strlen((const char*)zeile)<<endl;
    	return 0;
    }
    

    Auch wenn strlen einen (char*) möchte, kannst du es bei den meisten (ich glaube bei fast allen) Compilern ohne Pointer erledigen.
    Es muß sich halt nur um ein (char) handeln.



  • char foo[] ist ein yom Typ 'char *const'! Deswegen ist es also ein Pointer.

    char foo='a';
    strlen((const char*)a); //geht genauso wenig
    strlen(&a); //geht auch nicht, zwar überliefert der einen Pointer, aber strlen erwartet Null-terminierte Strings
    


  • strlen prüft auf '\0', bei (const char*)23 fehlt das Ende.

    Strings sind Null terminierte Arrays.

    char sz[2]={'a','b'};

    strlen(sz); stürtzt, gibt zufällig das Richtige oder die falsche Länge.
    Je nach dem was Hinter sz[2] ist;

    char sz[2]={'a','b'};
    char sz2[3]={'a','b','\0'};

    und nun strlen(sz); sollte 4 ergeben;



  • idefix schrieb:

    strlen prüft auf '\0', bei (const char*)23 fehlt das Ende.

    Hier wird der Wert 23 in einen Zeiger umgewandelt, kein Zeiger auf den char 23 erstellt. Und da das 23. Byte im (virtuellen) Speicher ziemlich sicher nicht dem Programm gehört, würde auch eine 0 nicht vor der Zugriffsverletzung retten, weil strlen diese gar nicht überprüfen könnte.

    und nun strlen(sz); sollte 4 ergeben;

    Das ist aber wirklich seeeehr unportabel 🙂 Ein schneller Test in VC7.1 Standard kann sich nicht zwischen 11 (Debug) und 3 (Release) entscheiden, und vielleicht sieht das schon beim nächsten Programmstart ganz anders aus...


Anmelden zum Antworten