Lassen Sie uns in C ++ mit std::vector
kurz und bündig bleiben.
Ich weiß, dass ich new char[n]
erstellen kann, um ein Array von n
chars zu erstellen. Dies funktioniert auch dann, wenn n
keine Kompilierzeitkonstante ist.
Aber sagen wir, ich wollte eine Größenvariable gefolgt von n Zeichen:
Mein erster Versuch ist folgender:
%Vor% Es scheint jedoch, dass new Test[n]
nicht das tut, was ich erwarte, und stattdessen n
size
s zuweist.
Ich habe auch gefunden, dass sizeof(std::string)
4 bei ideone ist, also scheint es, dass es sowohl die Größe als auch das char-Array in einem Block zuweisen kann.
Gibt es eine Möglichkeit, das zu erreichen, was ich beschrieben habe (vermutlich was macht std::string
schon?)?
Während dies tun kann (und oft in C als Workaround verwendet wurde), wird dies nicht empfohlen. Wenn das jedoch wirklich ist, was Sie tun möchten, können Sie dies mit den meisten Compilern tun (einschließlich derer, die nicht gut mit C99-Erweiterungen funktionieren).
%Vor%Die C-Spezifikationen vor C99 erlauben kein Array der Länge Null innerhalb einer Struktur. Um dies zu umgehen, wird ein Array mit einem einzelnen Element erstellt, und eine Zahl weniger als die Anzahl der angeforderten Elemente wird zur Größe der tatsächlichen Struktur (der Größe und des ersten Elements) hinzugefügt, um die gewünschte Größe zu erstellen.
Sie können auch den Trick "Länge 1 Array" verwenden. Dies ist in C:
%Vor%GCC unterstützt auch "0 length" Arrays für genau diesen Zweck: Ссылка
Wenn ich es richtig verstehe, möchten Sie eine Klasse, die einen einzelnen Zeiger auf eine dynamisch zugewiesene Zeichenfolge mit Längenvorwahl speichert. Sie können dies tun, indem Sie die Tatsache ausnutzen, dass char*
sicher alles aliasieren kann.
Eine einfache Implementierung, um zu zeigen, wie es gemacht werden kann :
%Vor%Tags und Links c++ c++11 new-operator dynamic-memory-allocation