Zum Inhalt springen

Die Größe eines Zeigers


CyberDemon

Empfohlene Beiträge

Hi!

Wenn ich einen Zeiger auf eine int - Variable (oder float, double, etc.) erzeuge, hat der Zeiger dann die gleiche Bytegröße?

Also:

int 2 Byte ; Zeiger auf int auch 2 Byte

char 1 Byte ; Zeiger auf char 1 Byte

float 4 Byte ; Zeiger auf float 4 Byte

Oder haben Zeiger immer die gleiche Bytegröße?

Thanx 2 all!

Link zu diesem Kommentar
Auf anderen Seiten teilen

Originally posted by Guybrush Threepwood

Hi,

ein Zeiger ist immer 4 Byte groß, egal auf welchen Typ er zeigt.

Das liegt daran, dass er ja nur die Adresse einer anderen Variable

enthält.

Gruß

Guybrush

Und 4 Byte deswegen, weil Windows jedem Programm einen virtuellen Speicherbereich von 4GB zuteilt.

Um jede dieser Adressen erreichen zu können sind eben 2 hoch 32 Bit nötig.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Originally posted by Guybrush Threepwood

ein Zeiger ist immer 4 Byte groß, egal auf welchen Typ er zeigt.

Die Größe ist vom Betriebssystem und der zu Grunde liegenden Prozessorarchitektur abhängig. Bei 32 Bit-Systemen üblicherweise 32 Bit (also 4 Byte), bei 64 Bit-Systemen je nach OS (und gegebenenfalls Compileroptionen) 32 oder 64 Bit! Wenn notwendig sollte man immer mit "sizeof()" arbeiten und sich nie darauf verlassen, dass Zeiger eine bestimmte Größe haben.

Nic

Link zu diesem Kommentar
Auf anderen Seiten teilen

Die Größe eines Zeigers hängt von der eingesetzten Basismaschine ab, das OS hat damit nichts zu tun. Konkret wird es hier wohl auf die Breite der Adressregister im Prozessor ankommen.

Bei einem reinen 16-Bit-System ist ein Zeiger auch 16 Bit "breit", bei einem reinen 32-Bit-System ist er 32 Bit usw. Dann gibt es noch Mischformen, etwa 20- oder 24bittige Adressen auf 16-Bit-Maschinen. Die älteren Amigas z.B. konnten nur 24 Bit adressieren, die Adressregister im MC68k waren aber trotzdem 32 Bit groß; das höchste Byte wurde dabei einfach ignoriert und wurde von findigen Codern als "Datenspeicher" missbraucht.

Auf jeden Fall findet man die korrekte Grösse eines Zeigers immer mit dem sizeof()-Operator heraus, und das ist das wichtigste. Wenn ein Programm also auf die Kenntnis der Zeigergröße angewiesen ist, dann hat das Programm diese eben mit sizeof() zu ermitteln.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Originally posted by Crow T. Robot

Die Größe eines Zeigers hängt von der eingesetzten Basismaschine ab, das OS hat damit nichts zu tun.

Die Aussage ist nicht korrekt. Gerade bei den 64-Bit Architekturen gibt es fast immer die Möglichkeit, 32 oder 64 Bit Versionen eines Betriebssystems zu installieren (das betrifft beispielsweise HPUX oder auch Solaris). HPUX11.0 existiert für PARISC-2.0 (64 Bit Architektur) sowohl in einer 32 Bit Version (Pointergroesse 32 Bit) als auch in einer 64-Bit Version (die Pointergroesse betraegt in diesem Fall 32 oder 64 Bit, je nach dem welches Datenmodell beim compilieren verwendet wird). Auf den 32 Bit-Version von HPUX laeuft kein 64 Bit Code auch wenn es sich bei der Prozessorarchitektur um eine 64 Bit-Architektur handelt.

Nic

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hmmm.... Mit den Interna von RISC-Systemen kenne ich mich ehrlich gesagt nicht aus. :( Wenn das OS in zwei Varianten existiert, dann muss der Code doch sicherlich speziell für diese Umgebung kompiliert werden, richtig? Aber ist das nur notwendig, um mit den System-APIs korrekt kommunizieren zu können, oder würden prozessornahe Programme auch nicht mehr funktionieren? :confused:

Link zu diesem Kommentar
Auf anderen Seiten teilen

Originally posted by Crow T. Robot

Wenn das OS in zwei Varianten existiert, dann muss der Code doch sicherlich um mit den System-APIs korrekt kommunizieren zu können,...

oder würden prozessornahe Programme auch nicht mehr funktionieren? :confused:

Also auf meinem Solaris 9 auf UltraSparc2 ist es so, das es 64 Bit - fähig ist aber trotzdem auch noch 32 Bit Applikationen darauf laufen können.

Was sind denn prozessornahe Programme ?

Frank

Link zu diesem Kommentar
Auf anderen Seiten teilen

Originally posted by SgtBadAzz

Also auf meinem Solaris 9 auf UltraSparc2 ist es so, das es 64 Bit - fähig ist aber trotzdem auch noch 32 Bit Applikationen darauf laufen können.

Interessehalber: Wie "groß" sind dann die Zeiger? :confused:

"Prozessornah" ist vielleicht unglücklich ausgedrückt. Ich meinte eigentlich Programme, die unabhängig vom OS laufen, z.B. wenn dieses noch gar nicht geladen wurde. Dann "weiss" der Code ja noch gar nichts von dieser Umgebung und ob diese 16, 32 oder 64 Bit nutzt. Dann ist der Code quasi nur von der Prozessor-Umgebung abhängig... War das verständlich?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo,

Das Datenmodell (32 oder 64 Bit) wird zur Compilezeit festgelegt und es muessen die korrekten Bibliotheken gelinkt werden (ein "Mischen" des Codes ist nicht moeglich). Die 64 Bit Varianten des Betriebssystems koennen sowohl 32 als auch 64 Bit Executables ausführen. Gesteuert wird der Modus ueber ein Bit im Prozessorstatuswort (bei HPPA das "W" Bit im PSW). D.h. ist dieses Bit auf den Wert "1" gesetzt werden die vollen 64 Bit der CPU ausgenutzt, ansonsten nur 32 Bit berücksichtigt.

Die Programme laufen grundsaetzlich unter der Kontrolle des Betriebssystems ab. Das Betriebssystem kuemmert sich darum, welche Modus bei der Ausfuehrung verwendet wird.

Code, der nicht unter der Kontrolle des Betriebssystems läuft (wenn er beispielsweise direkt auf die Maschine geladen wird), muss sich selbst um die Wahl des Datenmodells kümmern, das PSW entsprechend setzen, Memory-Management usw. initialisieren (d.h. es implementiert eine Art "Mini-OS").

Nic

PS:

Du kannst auch auf 32 Bit-Intel CPUs 16 Bit Betriebssysteme (wie aeltere DOS-Versionen) einsetzen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Originally posted by SgtBadAzz

Keine Ahnung wie gross die Zeiger sind, aber es geht. Muss mal sehen wie die das machen.

Frank

Das hängt auch hier vom Betriebssystem und den Compilerflags ab. Bei der 32 Bit Version 32 Bit, bei der 64 Bit-Version 32 (v8 Architektur) oder 64 Bit (v9). Sowohl Sun als auch HP verwenden bei den 64 Bit Varianten LP64 als Speichermodell. Bei Sun wird - wie auch bei HP - die Umgebung ueber das Prozessorstatusregister (PSTATE) bestimmt. Ist das address_mask Bit auf 1 gesetzt, so wird der Code als 32 Bit Code interpretiert.

Nic

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo,

In dem Fall kannst Du die Pointergroesse per Kommandozeilen-Argument beim Compilieren festlegen. Ich habe mal zwei Beispiele fuer HPUX und Solaris vorbereitet:

Erstes Beispiel (Sun Ultra-1, 64 Bit CPU, 64 Bit Solaris):


$ cat pointer.c

int main()

{

  printf("sizeof(char *) = %d\n", sizeof(char *));

}

$ gcc -o pointer pointer.c

$ ./pointer

sizeof(char *) = 4

$ gcc -m64 -o pointer pointer.c

$ ./pointer

sizeof(char *) = 8

$ uname -a

SunOS sliema 5.8 Generic_108528-16 sun4u sparc SUNW,Ultra-1

$ isalist

sparcv9+vis sparcv9 sparcv8plus+vis sparcv8plus sparcv8 sparcv8-fsmuld sparcv7 sparc

Zweites Beispiel (HP9000/C360, 64 Bit CPU 32 Bit HPUX11):

bash-2.03$ cc -o pointer pointer.c

bash-2.03$ ./pointer

sizeof(char *) = 4

bash-2.03$ cc +DD64 +DS2.0W +DA2.0W -o pointer pointer.c

bash-2.03$ ./pointer

bash: ./pointer: cannot execute binary file

bash-2.03$ getconf KERNEL_BITS

32

bash-2.03$ getconf HW_CPU_SUPP_BITS

32/64

KERNEL_BITS gibt an, um welche Betriebssystemvariante es sich handelt, HW_CPU_SUPP_BITS was von der CPU unterstuetzt wird. Da das OS nur 32 Bit Support hat, laesst sich der 64 Bit Code (obwohl 64 Bit CPU) nicht ausfuehren.

Nic

PS:

Bei Bedarf kann ich einen Beitrag für die FAQ zusammenstellen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...