Benutzer mit den meisten Antworten
Länge eines Arrays ermitteln; Zeiger auf ein dynamisches Array

Frage
-
Hallo liebe Community,
ich bin relativ neu in C++ und bin gleich auf Zeigerprobleme gestoßen. Meine Idee in Visual Basic:Dim arr[1] As Char arr[0] = 'a' ReDim Preserve arr[5] For i As Integer = LBound(arr, 0) To Ubound(arr, 0) arr[i] = CChar(i+65) Next
Ich versuche nun dasselbe in C++:void PointerAndMemoryBehaviour::makeMemTest() { ExpandableObject eo = ExpandableObject(); ExpandableObject *ptrEO = &eo; srand(time(NULL)); for (int i = 0; i < 10; i++) { std::cout << "Adress: " << ptrEO << " Size: " << sizeof (eo) << "\t["; eo.expandRandomized(); std::cout << "]\n"; } } PointerAndMemoryBehaviour::ExpandableObject::ExpandableObject() { arrStorage = new char[1]; arrStorage[0] = 'A'; std::cout << "0: '" << arrStorage[0] << "'\t1: '" << arrStorage[1] << "'\n"; } void PointerAndMemoryBehaviour::ExpandableObject::expandRandomized() { this->expand((random() % 10) * ((random() % 2) == 0 ? 1 : -1)); } PointerAndMemoryBehaviour::ExpandableObject::~ExpandableObject() { delete [] arrStorage; } void PointerAndMemoryBehaviour::ExpandableObject::expand(int signed amendment) { int intOldarrSize = sizeof (arrStorage) / sizeof (arrStorage[0]); std::cout << "{"; for (int i = 0; i < intOldarrSize; std::cout << arrStorage[ i++] << (i == intOldarrSize ? "} " : ",")); int intNewArrSize = intOldarrSize + amendment; if (intNewArrSize < 0) intNewArrSize = 0; std::cout << "Amendment: " << amendment << " \tOldSize: " << intOldarrSize << " \tNewSize: " << intNewArrSize; if (intNewArrSize != intOldarrSize) { delete [] arrStorage; arrStorage = new char[intNewArrSize]; for (int i = 0; i < intNewArrSize; i++) { arrStorage[i] = i + 65; } } }
nur leider klappt es nicht so, wie ich es will.- Typ geändert Robert Breitenhofer Samstag, 2. Januar 2010 21:32 Frage
Antworten
-
In C/C++ gibt es für "normale" Array-Datentypen (also mit new ...[] allokiert) keine direkte Möglichkeit die Größe zu ermitteln.
Verwende dazu am besten std::vector<...>
Jochen Kalmbach (MVP VC++)- Als Antwort markiert Robert Breitenhofer Samstag, 2. Januar 2010 21:33
-
Das geht aber *nicht* mit *dynamisch* allokiertem Speicher! Sondern nur mit "direktem" z.B: via:
TCHAR arrStorage[100];
mit
TCHAR *arrStorage = new TCHAR[100];
geht es nicht!
Ach so: Und schliessen kannst Du wenn Du in meiner Antwort auf "als Antwort markieren" drückst ;)
Jochen Kalmbach (MVP VC++)- Als Antwort markiert Robert Breitenhofer Samstag, 2. Januar 2010 21:34
Alle Antworten
-
In C/C++ gibt es für "normale" Array-Datentypen (also mit new ...[] allokiert) keine direkte Möglichkeit die Größe zu ermitteln.
Verwende dazu am besten std::vector<...>
Jochen Kalmbach (MVP VC++)- Als Antwort markiert Robert Breitenhofer Samstag, 2. Januar 2010 21:33
-
Lösungen mit der Standard Template Library
Wie Jochaen Kalmbach bereits erwähnte, existieren in der STL die Klassen std::vector und std::valarray. Beide verhalten sich wie ein Array und bieten die Methode "size()", welche die Größe des "Arrays" zurückgeben.
Möglichkeit der Größenbestimmung von char Arrays.
In char Arrays werden meistens Zeichenketten gespeichert. Diese werden in den meisten Fällen automatisch mit einem '\0' Zeichen beendet, welches das Ende der Zeichenkette festlegt.
Du kannst in einer Schleife diverse Felder des Arrays durchlaufen und alle Felder bis zum \0 Zeichen zählen.
Viele Bilbiotheken und WINAPI Funktionen fordern neben dem Zeiger auf das Arrays noch eine Variable vom Typen DWORD, int oder size_t, welche direkt bei der dynamischen Allokation auf die Größe des Arrays gesetzt werden.
Diese Lösung ist allerdings nur realisierbar, wenn der Zeiger, von welchem du die Größe zu ermitteln versuchst, nicht aus einer 3rd Party Bibliothek stammt. -
Sehr geehrter Herr Kalmbach,
vielen Dank für die Antwort. Diverse C++ Bücher habensizeof (arrStorage) / sizeof (arrStorage[0])
als DIE Lösung propagiert. Wie ich befürchtet habe ist Ihre Antwort wahr.
Danke für die Klarstellung.
Wenn ich jetzt noch wüsste, wie ich den Thread hier schließen kann, würde ich es machen. -
Das geht aber *nicht* mit *dynamisch* allokiertem Speicher! Sondern nur mit "direktem" z.B: via:
TCHAR arrStorage[100];
mit
TCHAR *arrStorage = new TCHAR[100];
geht es nicht!
Ach so: Und schliessen kannst Du wenn Du in meiner Antwort auf "als Antwort markieren" drückst ;)
Jochen Kalmbach (MVP VC++)- Als Antwort markiert Robert Breitenhofer Samstag, 2. Januar 2010 21:34