Warum sind die Ergebnisse von sizeof() verschieden?



  • const char x[] = "Info";
    
    	const char* p =  "Info";
    
    	int j = sizeof(x);
    	// j == 5
    	int i = sizeof(p);
        // i == 4
        // Compiliert mit VC VS2005
    

    😞



  • Silvester 2008 schrieb:

    const char x[] = "Info";
    
    	const char* p =  "Info";
    
    	int j = sizeof(x);
    	// j == 5
    	int i = sizeof(p);
        // i == 4
        // Compiliert mit VC VS2005
    

    😞

    x ist ein array mit 5 bytes.
    p ist ein zeiger und der hat immer 4 bytes, egal, auf was er zeigt. dieser zeigt auf den string "Info", der in der exe-datei liegt.

    x[1]='m'; geht. x ist ja auf dem stack.
    p[1}='m'; sollte eine schutzverletzung auslösen, weil du in die exe-datei schreiben willst.



  • volkard schrieb:

    p[1}='m'; sollte eine schutzverletzung auslösen, weil du in die exe-datei schreiben willst.

    Ich dachte, das Verhalten beim Schreibzugriff auf String-Literale sei undefiniert? Es müsste also nicht zwingend zu einem Laufzeitfehler kommen...

    Übrigens, die Stringlänge kannst du mit der Funktion strlen() bestimmen. Das ist aber eher C, in C++ kannst du die Klasse std::string nehmen, da hast du sogar zwei Funktionen zur Längenbestimmung zur Verfügung ( size() und length() ). 😉



  • Nexus schrieb:

    Es müsste also nicht zwingend zu einem Laufzeitfehler kommen...

    stimmt. hast recht. msvc6 unterschied da sogar zwischen debug- und release-mode, was dazu führte, daß ich mal ein schutzfehlerprogramm veröffentlicht hatte. 🤡



  • Danke für die Antwot!

    volkard schrieb:

    x[1]='m'; geht. x ist ja auf dem stack.

    error C3892: "x": Einer Variablen, die konstant ist, kann nichts zugeordnet werden.
    🤡

    Guten Rutsch!



  • Silvester 2008 schrieb:

    Danke für die Antwot!

    volkard schrieb:

    x[1]='m'; geht. x ist ja auf dem stack.

    error C3892: "x": Einer Variablen, die konstant ist, kann nichts zugeordnet werden.
    🤡

    Guten Rutsch!

    Dann nimm mal die const weg. 😉


Anmelden zum Antworten