sizeof() über Pointer



  • Hi,

    folgendes Problem ich übergeb einer Funktion einen char* Pointer und muss in der Funktion nun dessen Größe ermitteln - ist dies möglich oder muss ich die Größe über geben?

    greetz Slater



  • Du musst die größe mit übergeben.



  • Wenn du wirklich nicht den Array selbst, sondern nur einen Pointer auf das Anfangselement hast, kannst du die Grösse nicht bestimmen, musst und diesen Wert als Parameter übergeben.

    mfg JJ



  • Oft sehe ich ein sizeof auf ein char*, das scheint inkorrekt zu sein, ist dem so?
    Ich würde ja auf Anhieb sagen, der gibt die Größe der Zeigervariable, somit 2 zurück...



  • Exakt, sizeof schaut in C++ grundsätzlich nur auf den statischen Datentyp eines Ausdrucks, und kann daher auch statisch (zur Compilezeit) berechnet werden.

    char *s = "foo bar";
    sizeof(s) => 4 (Architekturabhängig)
    // Preisfrage:
    sizeof("foo bar") => ???
    


  • Bashar schrieb:

    Exakt, sizeof schaut in C++ grundsätzlich nur auf den statischen Datentyp eines Ausdrucks, und kann daher auch statisch (zur Compilezeit) berechnet werden.

    char *s = "foo bar";
    sizeof(s) => 4 (Architekturabhängig)
    // Preisfrage:
    sizeof("foo bar") => ???
    

    was kann man gewinnen?? 🙄



  • Ewigen Ruhm, Ehre und Anerkennung 😉



  • ooch... keine schokolade? dann nicht 😉



  • Für Gummibärchen mach ich mit 🤡



  • Bashar schrieb:

    Exakt, sizeof schaut in C++ grundsätzlich nur auf den statischen Datentyp eines Ausdrucks, und kann daher auch statisch (zur Compilezeit) berechnet werden.

    char *s = "foo bar";
    sizeof(s) => 4 (Architekturabhängig)
    // Preisfrage:
    sizeof("foo bar") => ???
    

    Also ob da rauskommt was du dir denkst wage ich jetzt einfach mal zu bezweifeln.
    Bei mir mit VC++ kommt 8 heraus, nähmlich die Anzahl der Bytes die er braucht um den String zu speichern.

    Bei:

    int a[10];
    sizeof(a) => 40 = 4 * sizeof(int)
    

    War mir das ja schon klar, da sizeof den Speicherplatz liefert den der Datentyp im Frame beansprucht. Hätte jetzt allerdings gedacht das er bei einem Stringliteral auch nur die größe des Pointers liefert, da dieses ja eigentlich nicht im Funktionsframe angelegt wird, aber da habe ich mich wohl geirrt.

    Gruß
    Entyl Sa



  • Hätte zwar auch 4 gesagt, weil normal ja ein temp char-array erzeugt wird und ein
    const char * darauf zeigt. Aber 3Compiler sagen "8" 😮 (VC++ 7, Mingw, Borland Cmd Line Compiler)



  • Entyl_Sa schrieb:

    Also ob da rauskommt was du dir denkst wage ich jetzt einfach mal zu bezweifeln.

    Warum?

    Bei mir mit VC++ kommt 8 heraus, nähmlich die Anzahl der Bytes die er braucht um den String zu speichern.

    Richtig, "foo bar" hat den Typ const char[8], also kommt 8 raus. Aber einfach Ausprobieren gibt keinen Preis 😉



  • Im Zweifelsfall ist

    cout << typeid("Hallo Welt!").name();
    

    doch sehr nützlich 😉



  • Ihr habt Bashars Post nicht richtig gelesen

    "sizeof schaut in C++ grundsätzlich nur auf den statischen Datentyp eines Ausdrucks"

    Und dass "foo bar" aus 8 Zeichen besteht, kann man doch problemlos zur Compilezeit feststellen 🙂



  • operator void: «A12_c» ... Dada lebt! 😃



  • operator void schrieb:

    Im Zweifelsfall ist

    cout << typeid("Hallo Welt!").name();
    

    doch sehr nützlich 😉

    A12_c ist mit etwas fantasie (?) echt ganz nützlich (mit g++) 😉



  • Bashar schrieb:

    Warum?

    Die Frage war so gestellt das ich davon ausging das du 4 erwartest, ich wollte dir hier nichts unterstellen.

    Bashar schrieb:

    Richtig, "foo bar" hat den Typ const char[8], also kommt 8 raus. Aber einfach Ausprobieren gibt keinen Preis 😉

    Den wollte ich auch garnicht für mich in Anspruch nehmen, sonst hätte mein Post nicht so verfasst das zu erkennen ist wie ich zu dieser Information gekommen bin.
    Aber ich werde schon noch irgendwie zu "Ewigen Ruhm, Ehre und Anerkennung" kommen. 😃



  • davie schrieb:

    A12_c ist mit etwas fantasie (?) echt ganz nützlich (mit g++) 😉

    Hups. Das letzte Mal, als ich mit MinGW und typeid() experimentiert hatte, war der Typ unter einem Bisschen Zeichenmüll noch gut lesbar. Na dann halt nicht 🙂



  • Ist er ja bei selbstdefinierten Klassen normalerweise auch: Foo => «F3FoovE».


Anmelden zum Antworten