2017-03-07 7 views
1

Wenn ich eine Struktur hätte, die nur aus kurzen Ganzzahlen ohne Vorzeichen besteht, würde das in zusammenhängenden Speicherplätzen derselben Größe gespeichert werden; Das Gleiche gilt auch, wenn ich ein Array von kurzen Ganzzahlen ohne Vorzeichen habe. Wie würden sie anders sein? Wie werden sie angesprochen? Ich bin mir bewusst, dass auf einen Array zugegriffen wird, indem ein Zeiger auf den Startwert des Arrays verweist, während ein Array-Operator einen Offset von diesem Speicherort setzt, gilt das gleiche für Strukturen oder sind Strukturen, auf die zugegriffen wird, die Speicherstelle für jedes Stück verwenden von Dateien?Was ist der Unterschied zwischen einer Struktur des gleichen Datentyps und einem Array?

+2

Der Unterschied besteht darin, dass Sie das Padding, das der Struktur hinzugefügt werden kann oder nicht, nicht beeinflussen können (ohne bestimmte Präprozessoranweisungen zu geben). Das Array ist nur * x-Nummer * von 'shorts', das' struct' ist das plus jede hinzugefügte Füllung. –

+1

Eine 'Struktur' kann von einer Funktion übergeben/zurückgegeben werden. Ein Array kann nicht. – chux

+0

Also angenommen, ich wollte von einer Funktion eine Reihe von zusammenhängenden Speicherorten ohne Padding übergeben, was müsste ich tun? –

Antwort

2

Nein, sie müssen nicht gleich sein und höchstwahrscheinlich nicht.

Bei Strukturelementen kann zwischen den Elementen ein Padding vorhanden sein. Es ist also nicht garantiert, dass aufeinanderfolgende Mitglieder im zusammenhängenden Speicher verbleiben. In diesem Fall kann basierend auf der Implementierung eine Zeigerarithmetik, die die Adresse des ersten Elements verwendet, funktionieren gültig sein.

Zitiert relevanten Teile C11 Standard, Kapitel §6.7.2.1/p15, Struktur und Vereinigung Bezeich

[..] Es unbenannte padding innerhalb eines Strukturobjekt sein kann, aber nicht an seinem Anfang .

und

Kapitel §6.5.3.4, sizeof Operator

[...] Wenn auf einen Operanden angewendet, die Typ-Struktur oder Vereinigung hat, das Ergebnis ist die Gesamtzahl von Bytes in einem solchen Objekt, einschließlich interner und abschließender Auffüllung.

Im Falle eines Arrays sind jedoch alle Elemente garantiert im zusammenhängenden Speicher vorhanden und die Zeigerarithmetik ist deterministisch.

+0

"* Nein, sie müssen nicht die gleichen sein" - "" und höchstwahrscheinlich sind sie nicht * "- Wahrscheinlich sind sie *. Eine Struktur, deren Mitglieder alle vom selben Typ sind, wird sie sehr wahrscheinlich zusammenhängend zuweisen. Aber es könnte am Ende Padding geben, wenn der Compiler beschließt, eine strengere Ausrichtung auf die Struktur als auf seine Mitglieder auferlegen. –

Verwandte Themen