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.
Ankündigung
Einklappen
Keine Ankündigung bisher.
C++, sizeof
Einklappen
Neue Werbung 2019
Einklappen
X
-
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.
-
Ein Gast antworteteSo 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.
Einen Kommentar schreiben:
-
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.
Einen Kommentar schreiben:
-
Ein Gast antworteteÜ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; }
Einen Kommentar schreiben:
-
Ups stimmt. Ja aber wie bekomme ich denn dann raus, wieviele Element das/der Array besitzt?
Einen Kommentar schreiben:
-
Ein Gast antwortetesizeof(list) gibt 4 (logisch, ist ja ein 32-Bit Pointer)
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.
Einen Kommentar schreiben:
Einen Kommentar schreiben: