cpp leere Array-Deklaration

7

Hallo Ich habe den folgenden Testcode und ich bin verwirrt über cpp.

  1. Wenn Sie in library.h ein Array mit einer leeren Element-Klausel deklarieren .. Was wird der Compiler wählen? Es beschwert sich auch nicht, ich benutze Cygwin.

  2. In library.cpp gebe ich zwei Elementen Werte zu, nimmt der Compiler ein Array mit einem Element an und schreibe ich das zweite Element außerhalb des Bereichs des Arrays?

library.h

%Vor%

library.cpp

%Vor%

client.cpp

%Vor%

Makefile

%Vor%     
user2050516 19.03.2013, 08:27
quelle

4 Antworten

10
  1. Es gibt keine Sprache namens C / C ++, also kann Ihr Q nicht mit beiden Tags versehen werden.
  2. Da Sie Klassen verwenden, kann Ihr Programm nur C ++ und nicht C.
  3. sein
%Vor%

Dieser Code ist in C ++ einfach illegal. Array-Größe in C ++ muss positive Kompilierzeitkonstante sein. Lösung ist es, es zu ersetzen:

%Vor%

Beachten Sie, dass die Deklaration

%Vor%

ist in c99 gültig und wird als Unvollständiger Array-Typ bezeichnet. Der C-Standard garantiert, dass a mindestens ein Element vom Typ char speichern kann. Dies ist in C ++ nicht gültig. Der C ++ - Standard erlaubt diese nicht. Einfach weil beide verschiedene Sprachen sind.

    
Alok Save 19.03.2013, 08:38
quelle
5

Erstens ist es kein legales C ++. Es ist ein alter Hack, den C nur gemacht hat legal in C98. Die Grundidee ist, dass solche struct nur sein können dynamisch zugeordnet (mit malloc ), und Sie jedoch zuweisen Für das Objekt danach wird viel Speicher benötigt. Also wirst du es tun etwas wie malloc( sizeof( library ) + strlen( s ) + 1 ) . Der Hack wird verwendet, um eine zusätzliche Zuweisung zu vermeiden.

Eine Klasse, die diesen Hack verwendet kann nicht mit new , nor kann es ein Mitglied oder eine Basisklasse sein. (Es kann kein Mitglied sein in C, entweder.)

Sie können dies in C ++ nachbilden:

%Vor%

Beachten Sie jedoch, dass dies im Gegensatz zur C-Lösung das Risiko von Ausrichtungsprobleme. Es funktioniert gut für Zeichentypen und es funktioniert, wenn andere Mitglieder der Klasse mindestens so viel benötigen Ausrichtung als Puffer-Typ, aber es kann sonst fehlschlagen. (Das Die Implementierung von std :: basic_string in g ++ verwendet it-and wird auf einigen Computern abstürzen, wenn sie mit double instanziiert werden.)

    
James Kanze 19.03.2013 08:49
quelle
4

Das leere Array deklariert ein Array der Länge Null. Es wird in C verwendet, indem eine Struktur S in einer Speicherzone platziert wird, die größer als sizeof (S) ist, und dann mit dem Array auf den verbleibenden Speicher zugegriffen wird:

%Vor%

Dies ist ein Trick, der in C ++ viel weniger nützlich ist. Verwenden Sie stattdessen einfach std :: vector.

    
sylvain.joyeux 19.03.2013 08:31
quelle
1

Es wird allgemein als struct hack in C bezeichnet. Es verwendet ein Feature namens flexibles Array-Element .

Dies ist jedoch nicht Teil einer C ++ - Standardspezifikation. Sehen Sie sich diese Frage an.

Beachten Sie, dass die Beobachtung, dass etwas scheinbar funktioniert, nicht bedeutet, dass Sie sich darauf verlassen können, dass es zuverlässig funktioniert. Wenn das Verhalten nicht definiert ist, kann technisch alles passieren. Einschließlich Raubvögel, die plötzlich angreifen.

In C ++ würden Sie wahrscheinlich stattdessen ein std::vector<char> oder ein std::string verwenden.

    
moooeeeep 19.03.2013 08:41
quelle

Tags und Links