Ankündigung

Einklappen
Keine Ankündigung bisher.

C++, sizeof

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • C++, sizeof

    Hi,

    find grad kein Forum das funzt (cplusplus.de down), deshalb mal hier die Frage:

    Habe eine Klasse CCString, deklariere einen Array der Länge 0 (!) dieser Klasse mittels

    CCString* list = new CCString[0];

    Wie bekomme ich jetzt die Größe des Arrays heraus?

    sizeof(list) gibt 4 (logisch, ist ja ein 32-Bit Pointer), sizeof(&list) gibt aber auch 4. Habe auch schon new CCString[99]; list[0] = "abcdef..."; gemacht, es bleibt einfach 4.
    sizeof(CCString) ergibt 20.

    Jemand ne Ahnung?

    Sinn eines Arrays der Länge 0 ist ein Unit-Test für eine andere Funktion, will sehen wie tolerant Funktionen sind, wenn sinnlose aber mögliche Werte ankommen.


  • #2
    sizeof(list) gibt 4 (logisch, ist ja ein 32-Bit Pointer)
    sizeof(&list) ist auch ein Pointer, ein Zeiger auf den Zeiger list.
    Du willst nicht den Adressoperator, sondern die Dereferenzierung benutzen.
    Aber auch damit bekommst Du nicht heraus, wieviel Platz die allozierten Elemente belegen. Du ermittelst, wieviel Platz ein Element belegt.

    Kommentar


    • #3
      Ups stimmt. Ja aber wie bekomme ich denn dann raus, wieviele Element das/der Array besitzt?

      Kommentar


      • #4
        Über Ptr p = new xyz[9]; mWn garnicht.
        sizeof() "wirkt" doch schon zur Compile-Zeit, wenn ich mich nicht irre.

        Code:
        class CCString
        {
        	int i;
        	int x;
        	int y;
        };
        
        void main(void)
        {
        // weit auseinander gezogen zum Nachvollziehen
        	CCString stackArray[9];
        	size_t sizeAll = sizeof(stackArray);
        	size_t sizeOne = sizeof(stackArray[0]);
        	size_t amount = sizeAll/sizeOne;
        	CCString* list = stackArray;
        	
        	return;
        }

        Kommentar


        • #5
          Hallo,

          danke für das Beispiel, umgeschrieben habe ich dann folgenden Compilerfehler bekommen:

          CCString list[0];
          // provoziert
          TestStringTools.cpp(93): error C2466: cannot allocate an array of constant size 0

          Ich interpretier das mal so, dass ein Array der Länge 0 nicht definiert werden kann, somit also auch ein Unittest darauf nicht nötig/möglich/sinnvoll ist.

          Danke dir.

          Kommentar


          • #6
            So tief stecke ich nun auch nicht im C/C++ Compilerbau drin.
            malloc(0) kann man ja aufrufen und ein new Klasse[0] ist nicht viel was anderes.

            Ich nehme mal an CCString* list = new CCString[0]; setzt list auf NULL?
            Also durchaus möglich, sollte aber schon durch eine andere Betrachtung im Unittest abgedeckt sein.

            Kommentar


            • #7
              Also die CCString-Klasse ist bereits geunittested. Obwohl es natürlich wieder so war, dass die Unit-Tests die nicht geklappt haben, auch größtenteils nicht verbessert wurden, da sie schon verwendet wurde. Blöd war auch dass der Unittest a) vom Programmierer der zu testenden Klasse selbst geschrieben wurde und b) auch noch NACH dem Schreiben der zu testenden Klasse. Naja wenigstens wurde b) jetzt auch mich abgewälzt.

              Aber gut, hat nix mit dem Problem zu tun. Habs jetzt trotzdem komplett rausgenommen, mir wurde gesagt, dass wenn in die Funktion falsche Werte geschmissen werden, auch falsche Werte rauskommen dürfen, da sonst die Funktion durch Validierung unnötig aufgebläht wird. Ist wohl Ansichtssache.

              Kommentar

              Lädt...
              X