2016-05-03 12 views
5

innerhalb einer Definition wie dieseAdresse eines Arrays in einer neuen Struktur deklariert

typedef struct 
{ 
    myType array[N]; 
} myStruct; 

myStruct obj; 

kann ich immer davon ausgehen, dass ([Bearbeiten] richtige Gießen unter der Annahme geschieht, was hier nicht der Schwerpunkt der Frage [/ bearbeiten ])

(&obj == &obj.array[0]) 

wird TRUE zurückgeben oder sollte ich den Compiler Sorgen über zusätzliche Polsterung Einführung der myType Ausrichtung Requisiten zu empfangen? In der Theorie sollte dies nicht passieren, da die Struktur ein einzelnes Feld hat, aber ich bin mir nicht ganz sicher.

+7

C und C++ sind ** verschiedene ** Sprachen und ein Vergleich ergibt verschiedene Arten in beiden. Aber keiner von ihnen hat eine Standardkonstante oder ein Makro namens "WAHR". – Olaf

+0

Ich würde empfehlen, 'obj.array' zu verwenden, wenn Sie auf das Array verweisen möchten, und' obj.array [0] ', wenn Sie auf das erste Element im Array verweisen möchten. Die Verwendung von "obj" für den Zugriff auf das Array wird für Außenstehende schwieriger zu verstehen sein. – jboockmann

+4

Nicht sicher über C, aber in C++ kann kein Padding vor der ersten Membervariable vorhanden sein. – NathanOliver

Antwort

6

Mit einer richtigen Besetzung, wird dies immer wahr zurückgeben.

Aus dem Bereich 6.7.2.1 des C standard:

13. Innerhalb eines Strukturobjekts, die Nicht-Bit-Feld Elemente und die Einheiten, in denen Bit-Felder-Adressen befinden, die erhöhen in die Reihenfolge, in der sie deklariert sind. Ein Zeiger auf eine Struktur Objekt, in geeigneter Weise konvertiert, zeigt auf seine ursprünglichen Mitglied (oder , wenn das Mitglied ein Bit-Feld ist, dann auf die Einheit, in der es residiert) und umgekehrt. Möglicherweise gibt es in einem Strukturobjekt ein unbenanntes Auffüllen, aber nicht am Anfang.

+0

Danke für die Bestätigung durch den C-Standard. Und danke auch den anderen Jungs, die das kommentiert haben (zumindest diejenigen, die es aufmerksam gelesen haben :-) – ad3angel1s

6

Nach dem aktuellen C++ Standard-Entwurf [class.mem] §20 (N4527), Hervorhebungen hinzugefügt:

Wenn ein Standard-Layout-Klasse-Objekt hat keine nicht-statischen Datenelemente, deren Adresse gleich die Adresse ist ihr erstes nicht statisches Datenelement. Ansonsten entspricht seine Adresse der Adresse seiner ersten Unterklasse (falls vorhanden). [Hinweis: Es kann daher in einer Standardlayout-Struktur Objekt, , ein unbenanntes Auffüllen geben, aber nicht am Anfang, um eine entsprechende Ausrichtung zu erreichen. - Endnote]

Ob myStruct ist Standard-Layout, hängt davon ab, ob myType ist Standard-Layout. Wenn dies der Fall ist, dann wird das, was Sie fragen, durch den C++ - Standard garantiert.

Beachten Sie, dass &obj und &obj.array[0] nicht verwandte Zeigertypen haben, daher ist der Ausdruck in C++ nicht zulässig.

Verwandte Themen