Struktur mit Array-Member variabler Länge zuweisen

7

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?)?

    
Clinton 03.10.2011, 23:10
quelle

5 Antworten

10

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.

    
Adam Maras 03.10.2011 23:22
quelle
8

Sie können placement new :

verwenden %Vor%     
Miguel 04.10.2011 03:05
quelle
6

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: Ссылка

    
Yann Ramin 03.10.2011 23:20
quelle
2

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%     
R. Martinho Fernandes 03.10.2011 23:41
quelle
1

Lassen Sie uns in C ++ mit std::vector kurz und bündig bleiben.

%Vor%     
Mahesh 03.10.2011 23:25
quelle