[C/C++] char *Test = new char[20]; int Size1 = sizeof(Test); int Size2 = sizeof(*Test);

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von thecoolman4rr, 6. Juli 2007 .

Schlagworte:
Status des Themas:
Es sind keine weiteren Antworten möglich.
  1. 6. Juli 2007
    char *Test = new char[20]; int Size1 = sizeof(Test); int Size2 = sizeof(*Test);

    Tja ich hoffe, die Überschrift sagt viel...
    Code:
    char *Test = new char[0];
    cout << "sizeof *Test: " << sizeof(*Test);
    cout << endl << "sizeof Test: " << sizeof(Test);
    Wirft
    Code:
    sizeof *Test: 1
    sizeof Test: 4
    aus...
    Das erste Ergebnis ist eindeutig das Ergebnis, eines einzigen Chars, ist aber bei einem 20er-CharArray "falsch"...
    Das zweite Ergebnis ist meiner Vermutung nach die Größe des Pointer (integer, 4 bytes). Also auch nicht das was ich haben will.

    Denn eigentlich, möchte ich eine nette Schleife machen à la:
    Code:
    for(int i = 0; i < sizeof(Test); i++)
    {
     ....
    }
    Was natürlich so nicht möglich ist...

    Habt ihr eine andere Lösung, außer ersteinmal das gesamte Array bis zum Ende nach '\0' zu durchsuchen und dann eine Zählvariable einzuführen?
    Wenn ja pls Post =))

    mfg thecoolman4rr

    PS: Wenn einem dafür eine bessere Überschrift einfällt pls post ich werd sie editieren =))
     
  2. 6. Juli 2007
    AW: char *Test = new char[20]; int Size1 = sizeof(Test); int Size2 = sizeof(*Test);

    Beim Inkrementieren bzw Dekrementieren Wird die Variable immer um die größe des Variablentypen auf den der Zeiger zeigt erhöht bzw weitergezählt also in deinem falle um 4 Bit(integer).

    Hab aber kein lust jetz auf ne Lösung sry aber daran wirds denke ich ma liegen.
     
  3. 6. Juli 2007
    AW: char *Test = new char[20]; int Size1 = sizeof(Test); int Size2 = sizeof(*Test);

    Der new-Operator reserviert nur so viel Speicher, wie die Klasse halt benötigt. Kann das jetzt nicht so gut erklären.
    Es liegt doch an den Zeigern oder?
     
  4. 6. Juli 2007
    AW: char *Test = new char[20]; int Size1 = sizeof(Test); int Size2 = sizeof(*Test);

    *test ist die aktuelle Position des Zeigers, der auf einen char zeigt. Deswegen 1.
     
  5. 6. Juli 2007
    AW: char *Test = new char[20]; int Size1 = sizeof(Test); int Size2 = sizeof(*Test);

    Hi !

    Ist ja klar ... Wenn du aufn Char zugreifst, ist er logischerweise 1 byte gross, und wenn du die Groesse eines Pointers haben willst, ist der Pointer 4 bzw. 8 Byte gross.

    Bei C musst du wissen, wie gross deine Arrays sind. Das ist nicht 'so lala' wie bei C++ oder irgendwelchen anderen Sprachen

    Zur Loesung deines Problems:
    Code:
    strlen ();
    strnlen ();
    Sagt dir, wie lang der String in deinem CharArray ist, falls er mit '\0' terminiert ist.
    Willst du die Groesse des Arrays, musst du es irgendwo speichern ... schliesslich alloziierst du ja auch den Speicher irgendwo, da sollte das kein Problem sein.

    Am besten als Variable speichern, weil er es sonst bei jedem Schleifendurchlauf neu berechnet.

    Mfg,

    Kolazomai
     
  6. 6. Juli 2007
    AW: char *Test = new char[20]; int Size1 = sizeof(Test); int Size2 = sizeof(*Test);

    Lol naja manche am Thema vorbei, manche auch das wiederholt, was ich selber im ersten Post geschrieben hab, aber naja ^^.
    Ich wollte ja nur sagen ^^ das dieses "sizeof(x)" leicht wurschtig ist ^^
    Bsp.:
    Code:
     char TestArray[20];
     char *Test = TestArray; // &TestArray geht nicht ^^
     
     cout << "sizeof *Test: " << sizeof(*Test);
     cout << endl << "sizeof Test: " << sizeof(Test);
     cout << endl << "sizeof int: " << sizeof(int);
     cout << endl << "sizeof TestArray: " << sizeof(TestArray);
     cout << endl << "sizeof *TestArray: " << sizeof(*TestArray) << endl;
    ergibt:
    Code:
    sizeof *Test: 1
    sizeof Test: 4
    sizeof int: 4
    sizeof TestArray: 20
    sizeof *TestArray: 1
    man beachte sizeof Test und size of TestArray. Es ist beide Male der selbe Array, nur mit verschiedenen Pointern. Einmal geht's und einmal nicht. Ich denke mal es liegt daran, das Arrays, die wie TestArray erstellt wurden, eine Struct-/Class-Instance sind und dort die gesamte Größe des Arrays gespeichert wird und daher auch angezeigt werden kann.
    Allerdings stellt sich dann für mich die Frage, warum bei new char[20] nicht auch eine solche Struct-/Class-Instance erstellt wird.

    @Kolazomai: Hehe so "lala" ist das ja in C++ auch nicht da guckt man einmal versehentlich bei 'ner Schleife über den Array-Rand hinaus (oder noch schlimmer man schreibt) und schon gibbet's was auf'e' Ohren.
    In diesem Fall, wollte ich aber eine Klasse schreiben, und die sollte ja möglichst variabel sein daher wäre es sehr nett gewesen, wenn es gegangen wäre. Jetzt hab ich es allerdings so geschrieben, das die Funktion die Arraylenght mitgeteilt kriegt, was allerdings auch nicht die schönste Lösung ist

    Ich denk mal auf die tolle Frage, Warum das so ist, kann mir hier niemand eine Antwort geben, weshalb ich hier mal closen werde. Falls ihr doch noch etwas sinnvolles beizusteuern habt, PM me oder 'nen Mod die freuen sich immer über PM's *sfg*.

    mfg thecoolman4rr
     
  7. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.