Erstellen eines vom Benutzer eingegebenen Arrays mit einem neuen Operator

8

Ich habe ein paar arraybezogene Fragen. Ich habe studiert, dass Array-Größe konstant auf Deklaration sein muss / Compiler muss seinen Wert kennen. Aber mit dem GNU GCC-Compiler (C ++ 11 Standardfilter) kann ich ein Programm mit einer Variablen als Array-Größe perfekt kompilieren und ausführen, wenn ich das Array dynamisch deklariere (mit new )

%Vor%

Ques1) Wird dies als Standard angesehen? Meine Professoren sind widersprüchlich.

Ques2) Wenn es ist Standard, in diesem Fall ist es möglich, die Größe des Arrays (oder eines Arrays) nach der Erstellung zu erweitern?

Ques3) Ist dieser Ausdruck wieder Standard, dann ist es möglich, ihn innerhalb einer Funktion zu verwenden - z. Verwenden Sie eine Funktion, um ein solches Array zu erstellen? (Wenn ja, wie?)

(PS: Hi, ich bin neu hier und auch noch ein Neuling in C ++)

    
Shisa 13.06.2013, 01:44
quelle

5 Antworten

6
  

Ques1) Wird dies als Standard angesehen? Meine Professoren sind widersprüchlich.

Ja, das ist vollständig gültig. Beachten Sie, dass Sie explizit den Speicher löschen müssen, auf den arr mit dem Operator delete[] zeigt. Es ist viel besser, ein std::vector<int> zu verwenden, das die Speicherverwaltung für Sie durchführt.

Sie könnten mit Arrays variabler Länge (VLAs) verwechselt werden, die in C++ nicht erlaubt sind:

%Vor%

Dies ist in C gültig, aber in C++ ungültig (C ++ 14 enthält VLAs, obwohl sie einige Unterschiede mit C VLAs aufweisen).

  

Ques2) Wenn es Standard ist, ist es in diesem Fall möglich, das zu verlängern   Größe des Arrays (oder eines Arrays) nach der Erstellung?

Nein, Sie können es nicht verlängern. Sie können ein größeres Array zuweisen, die Elemente kopieren und das vorherige löschen. Dies geschieht wiederum automatisch, wenn Sie std::vector<int> verwenden.

  

Ques3) Wenn dieser Ausdruck Standard ist, ist es dann möglich   Verwenden Sie es innerhalb einer Funktion - z. Verwenden einer Funktion zum Erstellen eines solchen   Array? (Wenn ja, wie?)

Ja, natürlich:

%Vor%

Aber wieder verwenden Sie std::vector :

%Vor%     
mfontanini 13.06.2013, 01:51
quelle
3
  

Ich habe untersucht, dass die Array-Größe bei der Deklaration konstant sein muss / der Compiler muss seinen Wert kennen.

Nun, das stimmt, aber nur für statische oder automatische Arrays. Sie weisen dem Heap ein dynamisches Array zu, das anders ist.

Statisches Array

Ein im globalen Gültigkeitsbereich deklariertes Array muss eine konstante Größe haben.

%Vor%

Automatisches Array

Ein Array, das automatisch innerhalb einer Funktion zugewiesen wird, muss eine konstante Größe haben (mit Ausnahme, siehe unten).

%Vor%

Dynamisches Array

Ein dynamisches Array, das auf dem Heap mit new zugewiesen wurde, kann eine beliebige Größe, Konstante oder Variable haben.

%Vor%

GCC-Erweiterung

Die Ausnahme ist, dass GCC die Verwendung einer -Variablen ermöglicht, um die Größe eines automatischen Arrays zu deklarieren:

%Vor%

Diese Verwendung ist jedoch kein Standard.

    
Greg Hewgill 13.06.2013 01:57
quelle
0

Frage 1 - Der Operator 'new' wird verwendet, um eine dynamische Zuweisung zu machen, ich meine, wenn Sie vorher nicht wissen, wie groß das Array ist, also gibt es kein Problem, Sie können es tun! Ich denke, dass Ihre Professoren mit C sintax verwechseln, wo Neues weder existiert noch erlaubt ist, Dinge zu machen wie: int p [n]; zum Beispiel.

Frage 2 - Nein, es ist nicht möglich, die Größe eines mit operator new erstellten Arrays zu erhöhen. Sie müssen ein anderes Array zuordnen und die Daten kopieren. Sie können den Vektor verwenden, um es einfach zu machen.

Frage 3 - Ich verstehe nicht warum, aber es ist möglich ..

%Vor%     
Rafael Azevedo 13.06.2013 02:06
quelle
0

Q1: Wird dies als Standard betrachtet?

  

Gegeben die Definition int n = 42, neuer float [n] [5]   ist wohlgeformt (weil n der Ausdruck von a ist   noptr-new-declarator), aber der neue float [5] [n] ist schlecht gebildet (weil n ist   kein konstanter Ausdruck).                  - 5.3.4.6, N3242

     

Wenn der zugewiesene Typ ein Array-Typ ist, lautet die Zuweisungsfunktion   name ist operator new [] und der Name der Freigabe-Funktion ist   Operator löscht [].
                 - 5.3.4.8, N3242

     

new T[5] führt zu einem Aufruf von operator new[](sizeof(T)*5+x)   Hier sind x und y nicht negative nicht spezifizierte Werte, die den Overhead der Array-Zuweisung darstellen;                  - 5.3.4.12, N3242

F2: Wenn es Standard ist, ist es in diesem Fall möglich, die Größe des Arrays (oder eines Arrays) nach der Erstellung zu erweitern?

Teilweise nicht oder nicht empfohlen.
Wenn die Zuweisungsfunktion einen anderen Wert als Null zurückgibt, muss es sich um einen Zeiger auf einen Speicherblock handeln in dem Platz für das Objekt reserviert wurde. Die meiste Zuweisung erfolgte im Heap, und es ist möglicherweise nicht mehr zusammenhängender Speicher übrig, was für das Array wichtig ist.
Wenn Sie dies tun müssen und eine Speicherabfrage haben, verwenden Sie den neuen Operator placement, Sie können dies teilweise tun, aber was Sie jetzt tun, ist was der Designer von Allokator tun, und Risiko haben den inneren Speicher zu ruinieren.

F3: Verwenden einer Funktion zum Erstellen eines solchen Arrays? (Wenn ja, wie?)

  

Von einem new-Ausdruck erstellte Entitäten haben eine dynamische Speicherdauer   (3.7.4). [Anmerkung: Die Lebensdauer einer solchen Entität ist nicht notwendigerweise   beschränkt auf den Umfang, in dem es erstellt wird. - Endnote]                  - 5.3.4.1, N3242

Der Rest der Dinge ist, wie man solche Funktion entwerfen kann, um Ihre Bedürfnisse zu erfüllen, sogar die Vorlage zu verwenden.

%Vor%     
yuan 13.06.2013 10:07
quelle
0

Als Ergänzung zu anderen Antworten:

Vektoren

(Mit Vektor für dynamische Größenänderung vereinbart):

%Vor%
  • Wenn die neue Größe größer als die alte ist, werden zusätzliche Elemente auf 5 initialisiert (oder 0 im Fall von int, wenn der zweite Parameter nicht verwendet wird) und alte Elemente bleiben unverändert.
  • Wenn die neue Größe niedriger als die alte ist, wird sie abgeschnitten.

Arrays

Randnotiz: (über Stapel und Heap Zuordnung)

Die Art und Weise, wie ein array behandelt wird, kann zu signifikant unterschiedlichen Ergebnissen führen (Siehe diese sehr interessante Diskussion ):

%Vor%     
Gauthier Boaglio 13.06.2013 02:02
quelle

Tags und Links