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
)
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 ++)
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:
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
:
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.
Ein im globalen Gültigkeitsbereich deklariertes Array muss eine konstante Größe haben.
%Vor%Ein Array, das automatisch innerhalb einer Funktion zugewiesen wird, muss eine konstante Größe haben (mit Ausnahme, siehe unten).
%Vor% Ein dynamisches Array, das auf dem Heap mit new
zugewiesen wurde, kann eine beliebige Größe, Konstante oder Variable haben.
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.
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%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 vonoperator 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%Vektoren
(Mit Vektor für dynamische Größenänderung vereinbart):
%Vor%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 ):
Tags und Links arrays c++ dynamic-allocation