2012-03-30 15 views
-3

Ich schreibe ein Programm in C++ und ich muss ein Array eines Strukturobjekts initialisieren, das ich erstellt habe. Es sieht etwa so aus:Initialisierung eines leeren Arrays in C++

typedef struct { 
float x; 
float y; 
} vec2; 

Und dann initialisieren ich ein Array wie folgt aus:

vec2 hotSpot[1000]; 

Ich dachte, wenn ich ein solches Array initialisiert, wäre es völlig leer sein, aber wenn ich drucken Sie den Wert von sizeof (hotSpot), es heißt 8000!

Bin ich irgendwo falsch oder habe ich irgendein Konzept falsch verstanden? Wie mache ich dieses Array leer?

+8

Geben Sie Ihre Struktur nicht ein. Wo immer Sie diese Idee haben, geben Sie sie jetzt auf, da es kein C++ ist. –

Antwort

2

Ihre hotSpot kann nicht leer sein, da Sie es als ein Array von 1000 initialisiert haben. Dort gibt es 1000 Elemente.

Wenn vec2 hotSpot[1000]; geschieht, legt er alle 1000 Werte als uninitialized variable.

Die Elemente in hotSpot nicht gültig sind, da sie nicht initialisiert wurden. Wenn Sie alle auf Null setzen möchten, können Sie memset verwenden, um alle auf Null zu initialisieren. Weitere Informationen zu Arrays finden Sie unter this reference.

+0

Ich bin mir nicht sicher, warum du deine alte Antwort löschst, anstatt sie zu bearbeiten, aber ich werde meinen Kommentar erneut posten - die Wert-Initialisierung wäre weit besser als "memset" (das keinen wirklichen Platz hat) moderner C++ Code). – ildjarn

+2

Memset ist immer noch eine sehr häufige und gültige Praxis, um schnell einen großen Satz ein Werte zu setzen. – josephthomas

+1

Es ist eine übliche Praxis in _C_, wo es notwendig ist; In C++ ist es nicht (oder _should_ not). Value-Initialisierung hat wohldefiniertes Verhalten, ist idiomatischer und ist weniger Tipparbeit. – ildjarn

0

sie leer sind Daten-weise, aber der Speicher in der Lage sein zugeteilt zu halten 1000 * 2 float * 4 Bytes

+0

Was bedeutet '1000 * 2 float * 4 Bytes'? Woher kommen deine 4 magischen Bytes? (Beachten Sie, dass 'sizeof (float)' == 4.) – ildjarn

+0

vec2 hotSpot [1000]; es gibt 1000 vec2. in jedem vec2 gibt es 2 Schwimmer.Jeder Float hat 4 Bytes. klingt das magisch? nicht zu mir. – tartar

+0

Nicht wenn du es so buchstabierst, aber deine Antwort sagt es nicht so. ; -] – ildjarn

5

Ihr Array ist nicht und kann niemals „leer“ sein. Es hat und wird immer 1000 Elemente haben. Das ist die Natur von C++ - Arrays.

Das Problem ist, dass diese Elemente nicht in einem deterministischen Zustand sind, und in der Tat Zugriff auf ein Element, das nicht initialisiert wurde undefined Verhalten.

Allgemein können Objekte in C++ niemals "leer" sein. Sie existieren immer. Wenn ein Objekt nicht existiert, gibt es kein Objekt. Einige Objekte existieren immer in einem bestimmten Zustand, während andere Objekte (wie primitive Typen oder ein benanntes Objekt nach std::move d) in einem nicht initialisierten oder unbestimmten Zustand existieren können - sie existieren immer noch, aber das Einzige, was Ihnen erlaubt ist mit ihnen zu tun ist zuweisen einen Wert für sie.

0

ich raten bin, dass Sie Ihre ‚leer‘ Array auf diese Weise initialisiert werden soll:

vec2 hotSpot[]; // Defines an array of undefined length 

Aber wenn Sie wollen, dass es als ‚leer‘ initialisieren, dh seine gesamte Inhalt mit Nullen füllen:

vec2 hotSpot[1000]; // Defines an array of 1000 items in length 
memset(hotSpot, 0, sizeof(hotSpot)); // Fill the array with zeros 
+3

Ughhh .. mehr 'memset' Empfehlungen. : - [Dies ist nicht C, es ist C++; Verwenden Sie _language_ facilities, um Dinge zu initialisieren, nicht Bibliotheken. – ildjarn

+0

Die Sache ist, ich möchte, dass dieses Array leer ist, wenn ich es erstelle. Das heißt, es sollte NULL sein. Wenn ich also sizeof (hotSpot) sage, muss "0" gedruckt werden. Ist das möglich? –

+0

Und wenn ich "vec2 hotSpot [];" verwende, gibt es mir eine Fehlermeldung "Größe von hotSpot unbekannt". –

0

Ein Float ist nur 4 Bytes in Ihrem Gerät. Bei der Initialisierung nimmt der HotSpot 8000 vollständig auf.

+0

Nimmt 8000 Bananen? – Till

+2

um, vielleicht sind 8000 Hamburger noch besser^- ^ – Morpheus

-1

Bitte geben Sie Ihrer Struktur einen Namen. Der nach Klammern angegebene Name ist der Name des Objekts, nicht der Name der Klasse/Struct

Verwandte Themen