Über Zeiger sizeof der Zeiger Adresse bekommen



  • Wie kann ich über einen Zeiger die Größe mit "sizeof" von der Adresse bestimmen:

    #include <iostream>
    using namespace std;
    
    void func(char *p);
    
    int main()
    {
        char save[11]="Buchstaben";
        func(save);
    
        return 0;
    }
    
    void func(char *p)
    {
        cout << sizeof(*p) << endl;
    }
    

    So gehts ja anscheinend nicht. Da müssten ja 11 Byte rauskommen, kommt aber nä "1"...weiß jemand was ich mein, und wies geht?
    Die eins kommt wahrscheinlich weil ich mit "*p" nur das erste Feld anspreche, aber wie Spreche ich dann das komplette Feld an...bzw. was für Möglichkeiten gibts um trotzdem die größe rauszubekommen.

    MfG
    Stromberg



  • Hallo Stromberg,

    du derefenzierst den Zeiger auf den char und fragst danach,
    wie groß ein char ist. Ein char hat (afaik auf jedem Betriebssystem) die
    Größe 1 Byte.

    Wie groß dein array ist kriegst du mit Standard-C- bzw. -C++-Mitteln nicht raus.
    Ob es betriebssystemspezifische Mittel gibt, weiß ich nicht, denke aber eher nicht.

    Da du hier im C++-Forum postest, schlag ich dir ne (ungetestete) C++-Variante deines Code vor:

    #include <string>
    #include <iostream>
    
    void func(const std::string& value);
    
    int main()
    {
        std::string letters("Buchstaben");
        func(letters);
    
        return 0;
    }
    
    void func(const std::string& value)
    {
        const char *p = value.c_str(); // falls du irgendwo nen const char* brauchst
        std::cout << value.size() << std::endl;
    }
    

    Du kannst aber auch in deiner C-Variante nach der string-terminierenden \0 suchen.

    Dies erledigt die Funktion strlen für dich:
    http://www.cplusplus.com/reference/clibrary/cstring/strlen.html

    Nimm aber besser den C++ Vorschlag 😉

    Für die Verwendung mit anderen Datentypen würde ich std::vector<MyClass> vorschlagen. Die Größe kannst du analog Abfragen.

    Gruß,
    CSpille


  • Mod

    Array als Referenzparameter:

    void func(char (&a)[11])
    {
        cout << sizeof a << endl;
    }
    ...
        func(save);
    

    oder Zeiger auf das Array übergeben:

    void func(char (*p)[11])
    {
        cout << sizeof *p << endl;
    }
    ...
        func(&save);
    


  • Hi Stromberg,

    der Vorschlag von Camper nimmt deiner Funktion jedoch jede Variabilität,
    da nur noch Zeiger auf Arrays mit einer Größe von genau 11 akzeptiert werden.
    Ich denke nicht, dass es das ist, was du willst.

    Gruß,
    CSpille



  • für array gibts noch std::vector



  • @und:

    CSpille schrieb:

    Für die Verwendung mit anderen Datentypen würde ich std::vector<MyClass> vorschlagen.

    😉

    Gruß,
    CSpille



  • nur eine anmerkung

    CSpille schrieb:

    Hallo Stromberg,

    du derefenzierst den Zeiger auf den char und fragst danach,
    wie groß ein char ist. Ein char hat (afaik auf jedem Betriebssystem) die
    Größe 1 Byte.

    ein char ist so groß wie ein byte, weil ein char ein byte ist. per definitionem.



  • Nein, ein char ist nicht immer 1 Byte (8 Bit) groß!
    sizeof(char) liefert immer 1, aber trotzdem kann 1 char aus z.B. 4 Bytes bestehen.
    sizeof der anderen Datentypen liefert dann immer einen Wert relativ zu sizeof(char).



  • Th schrieb:

    Nein, ein char ist nicht immer 1 Byte (8 Bit) groß!
    sizeof(char) liefert immer 1, aber trotzdem kann 1 char aus z.B. 4 Bytes bestehen.
    sizeof der anderen Datentypen liefert dann immer einen Wert relativ zu sizeof(char).

    Schockierende Neuigkeit: Ein Byte ist auch nicht immer 8 Bit breit. Und der Standard (zumindest der C Standard, wenn es bei C++ anders sein sollte bitte berichtigen) definiert dass ein char ein Byte ist.



  • Ich zitiere mal Stroustrup, Die C++ Programmiersprache, 2.3.1 Variablen und Arithmetik:

    Eine char-Variable hat die Größe, auf einem vorgegebenen Rechner ein Zeichen (üblicherweise ein Byte) aufzunehmen.

    Man beachte das 'üblicherweise'.

    Mit der Bezeichnung "Byte = 8 Bit" beziehe ich mich, auf die gebräuchliche Definition von Byte (s. Oktett): http://de.wikipedia.org/wiki/Byte
    Auch wenn es noch andere Definitionen von Byte gibt...

    Weiterhin ist garantiert, daß ein char (zumindestens in C++) immer mindestens 8 Bit speichern kann (was nach der gebräuchlichen Defintion von Byte also bedeutet, daß ein char größer als ein Byte sein kann).

    Besser ist es, man verwendet den Begriff Byte am besten gar nicht erst in Bezug auf Datentypengrößen, sondern spricht nur von x Bits.



  • O.K. dann zitiere ich halt mal den C++ Standard (ISO/IEC 14882:1998(E), First Edition):

    1.7 The C++ memory model [intro.memory]
    The fundamental storage unit in the C++ memory model is the byte. A byte is at least large enough to contain any member of the basic execution character set and is composed of a contiguous sequence of bits, the number of which is implementation-defined. ...



  • die stelle ist fast noch prägnanter:

    C++ Standard ISO/IEC 14882:2003, Section 5.3.3 schrieb:

    The sizeof operator yields the number of bytes in the object representation of its operand. [...] sizeof(char), sizeof(signed char) and sizeof(unsigned char) are 1;



  • Deswegen ist C und C++ auch deprecated, wie wir in einem anderen Thread gelernt haben.


Anmelden zum Antworten