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?
Antwort
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.
"* 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. –
- 1. Was ist der Unterschied zwischen einem Array und einem Objekt?
- 2. Was ist der Unterschied zwischen Gleichen und Gleichen in ABAP?
- 3. Was ist der Unterschied zwischen einem Controller und einem Service?
- 4. Was ist der Unterschied zwischen einem Ausdruck und einer Aussage?
- 5. Was ist der Unterschied zwischen einer Sprache und einem Framework?
- 6. Was ist der Unterschied zwischen Struktur und Klasse
- 7. Was ist der Unterschied zwischen Enum-Struktur und Enum-Klasse?
- 8. Was ist der Unterschied zwischen einem Bündel und einer Absicht?
- 9. Was ist der Unterschied zwischen einem URI und einer URL?
- 10. Was ist der Unterschied zwischen einem Algorithmus und einer Funktion?
- 11. Was ist der Unterschied zwischen einem Fehler und einer Ausnahme?
- 12. Was ist der Unterschied zwischen einem Benutzer und einer Rolle?
- 13. Was ist der Unterschied zwischen einer Schließung und einem Modul?
- 14. Was ist der Unterschied zwischen einem Schema und einer Migration?
- 15. Was ist der Unterschied zwischen einem Adapter und einer Netzwerkschnittstelle?
- 16. Was ist der Unterschied zwischen einer Ansicht und einem Stream?
- 17. Was ist der Unterschied zwischen einem Animator und einer Animation?
- 18. Was ist der Unterschied zwischen einem Tupel und einem compressed_pair?
- 19. Was ist der Unterschied zwischen:
- 20. Was ist der Unterschied zwischen "Array (n)" und "[... Array (n)]"?
- 21. Was ist der Unterschied zwischen einem Feature und einem Label?
- 22. Was ist der Unterschied zwischen einem Workflow und einem Flowchart?
- 23. Was ist der Unterschied zwischen Verilog! und ~?
- 24. Was ist der Unterschied zwischen der CvCapture-Struktur und der VideoCapture-Struktur?
- 25. Was ist der Unterschied zwischen Array und WrappedArray in Scala
- 26. Was ist der Unterschied zwischen `==` und `ist`?
- 27. Was ist der Unterschied zwischen einer Klassenvariablen und einer Klasseninstanz?
- 28. Was ist der Unterschied zwischen einem Index und einem Fremdschlüssel?
- 29. Was ist der Unterschied zwischen einem RoutedCommand und einem RoutedUICommand?
- 30. Was ist der Unterschied zwischen einem Muster und einem Pfad?
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. –
Eine 'Struktur' kann von einer Funktion übergeben/zurückgegeben werden. Ein Array kann nicht. – chux
Also angenommen, ich wollte von einer Funktion eine Reihe von zusammenhängenden Speicherorten ohne Padding übergeben, was müsste ich tun? –