Frage

  

Mögliche Duplizieren:
   Gibt es irgendwelche Plattformen, auf denen Zeiger auf verschiedene Arten unterschiedliche Größen haben?

Ich habe an mehreren Stellen gelesen, dass Zeiger verschiedenen Typen unterschiedliche Darstellungen in Standard-konformen C-Implementierungen haben können. Dies ist eine Sache, die es notwendig, Gusszeigerargumente zu printf macht, z.

int foo;
printf("address is %p\n", (void *) &foo);

Ich war skeptisch, dieses und durch den C99-Standard (Dokument WG14 N1256, verfügbar unter http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf ). Bei 6.2.5.27 heißt es:

  

Ein Zeiger auf Lücke soll die gleiche Darstellung und Ausrichtungsanforderungen als   Zeiger auf ein Zeichen-Typ. In ähnlicher Weise Zeiger auf qualifizierte oder unqualifizierte Versionen   kompatible Typen sind die gleichen Darstellung und Ausrichtungsanforderungen haben. Alle Verweise auf Strukturtypen wird die gleiche Darstellung und Ausrichtungsanforderungen haben   wie jeder andere. Alle Verweise auf Union-Typen haben die gleiche Darstellung haben und   Ausrichtungsanforderungen als zueinander. Pointers auf andere Typen müssen nicht die gleichen   Darstellung oder Ausrichtungsanforderungen.

Also, es klingt in der Tat wie eine konforme Implementierung C99 unterschiedliche Darstellungen für Zeiger verschiedenen Typen verwenden könnte.

Meine Frage lautet: , was C-Implementierungen / Architekturen gibt, die tatsächlich unterschiedliche Darstellungen für Zeiger verschiedenen Typen verwenden

War es hilfreich?

Lösung

Classic Cray (weiß nicht, über ihre neuen Produkte) konnte nicht Adreßbuchstaben mit regelmäßigen Zeiger, so char* und daher void* verschieden waren von nativen Vektor Zeiger.

(Siehe Keiths Kommentar unten, though. Es haben in Gebrauch verschiedenen ABI gewesen, und durch die die niederwertige Adresse Bits zu den höherwertigen Ende zu drehen, haben sie manchmal die „fein“ machen und „grob“ Zeiger kompatibel zu einem gewissen Grad.)

Andere Tipps

Die wohl bekannteste ist die Real-Mode-x86-Prozessoren, die 16-Bit-Datenzeiger und 32-Bit-Funktionszeiger je nach Speichermodell (oder könnten Sie haben 32-Bit-Datenzeiger mit 16- Sie wählten haben könnte Bit-Funktionszeiger, oder etwas noch einmal anders ...).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top