Wie viele Bytes nehmen Zeiger ein?

Lesezeit: 7 Minuten

Benutzer-Avatar
RegierungFX

Ich bin etwas verwirrt über Zeiger und wie viele Bytes sie belegen. In meinem Lehrbuch steht zunächst, dass Zeiger auf 16-Bit-Systemen 2 Bytes belegen, 32-Bit-Systeme 4 Bytes, 64-Bit-Systeme 8 Bytes und so weiter. Dann, 10 Zeilen später, heißt es, dass Zeiger so viele Bytes belegen, wie zum Halten der Adressen benötigt werden. Hier sind meine Fragen:

  1. Bedeutet dies also, dass, wenn wir uns beispielsweise auf einem 64-Bit-System befinden, die Adresse höchstens 8 Bytes benötigt?
  2. Wenn wir uns auf einem 16-Bit-System befinden und Zeiger 2 Bytes benötigen und die Adresse mehr 2 Bytes benötigt, um platziert zu werden, was passiert dann?

  • Duplikat von stackoverflow.com/questions/1473935/…

    – Daniel

    24. Dezember 2013 um 16:04 Uhr

  • @alk Ich vermute, es ist ein Tippfehler und er meinte 64bit in #1

    – Leeor

    24. Dezember 2013 um 16:07 Uhr

  • @alk @ Leeor Ja, ich meine 64bit.

    – RegierungFX

    24. Dezember 2013 um 16:23 Uhr


Es gibt keine feste Antwort; es hängt vollständig von der Architektur, der Compiler-Implementierung und sogar dem Typ des Zeigers selbst ab. Es ist nicht garantiert, dass Zeiger auf unterschiedliche Typen die gleiche Größe und/oder Darstellung haben.

Nehmen wir beispielsweise eine wortadressierte Architektur an, bei der die kleinste adressierbare Speichereinheit 16 Bit breit (oder breiter) ist. Jedes Wort kann mehrere enthalten char Werte; alle anderen Typen nehmen ein ganzes Wort oder mehr ein. Auf einer solchen Architektur, a char * und void * würde im Vergleich zu anderen Zeigertypen einige zusätzliche Bits benötigen, um in das Wort versetzt zu werden.

Beachten Sie auch, dass ein Zeigertyp sein kann breiter als die Anzahl der tatsächlich zum Speichern einer Adresse erforderlichen Bits. Der ursprüngliche Macintosh lief auf einer Motorola 68000-CPU, die eine Wortgröße von 32 Bit hatte, aber nur 24 Bit auf dem Adressbus. Zeigertypen waren 32 Bit breit, wobei die oberen 8 Bit ungenutzt blieben. Unternehmungslustige MacOS-Programmierer nutzten dies aus, um einige Daten im obersten Byte eines Zeigertyps zu speichern und so das Beste aus den kostbaren 128 KB RAM herauszuholen. Natürlich veröffentlichte Motorola schließlich eine CPU mit 32 Adresszeilen (die 68020), was bedeutet, dass der gesamte Code neu geschrieben werden musste.

Auf moderner, handelsüblicher Desktop- und Serverhardware (sprich: x86) kann man ziemlich sicher davon ausgehen, dass alle Zeigertypen die gleiche Größe wie die native Wortgröße (32- oder 64-Bit) haben und dass alle Zeigertypen die gleiche Größe haben und Vertretung. Seien Sie sich bewusst, dass dies nicht der Fall ist haben wahr sein.

Benutzer-Avatar
NPE

Die kurze Antwort ist, dass es darauf ankommt. Wenn wir sagen, dass ein System 32-Bit ist, könnte dies bedeuten, dass die native Ganzzahl 32 Bit breit ist, dass die native Adresse (dh die Zeigergröße) 32 Bit breit ist, oder beides.

Darüber hinaus verwendet nicht jede Architektur a flaches Speichermodell (Siehe zum Beispiel x86-Speichersegmentierung). Dies verkompliziert die Sache zusätzlich.

Es ist am besten, die Größe des Zeigers als undurchsichtig zu behandeln.

C99 bietet Werkzeuge in Form von intptr_t und uintptr_t -Typen, bei denen es sich um ganze Zahlen handelt, die garantiert breit genug sind, um einen Zeiger aufzunehmen.

Benutzer-Avatar
Rndp13

Die Größe des Zeigers hängt grundsätzlich von der Architektur des Systems ab, in dem er implementiert ist. Beispielsweise beträgt die Größe eines Zeigers in 32 Bit 4 Bytes (32 Bit) und 8 Bytes (64 Bit) in 64-Bit-Maschinen. Die Bittypen in einer Maschine sind nichts anderes als Speicheradressen, die sie aufnehmen kann. 32-Bit-Maschinen können halten 2^32 und 64-Bit-Maschinen halten können 2^64 Adressräume. Ein Zeiger (Variable, die auf einen Speicherplatz zeigt) sollte also in der Lage sein, auf eine der Speicheradressen (2^32 for 32 bit and 2^64 for 64 bit), die eine Maschine hält.

Aus diesem Grund sehen wir die Größe eines Zeigers in einer 32-Bit-Maschine als 4 Byte und in einer 64-Bit-Maschine als 8 Byte.

Beantwortet in Ist die Größe (eines Zeigers) immer gleich vier?

Zeiger werden verwendet, um die Adresse einer Variablen zu speichern. Die Breite der Speicheradresse/des Speicherplatzes hängt von der Computerarchitektur ab. Wenn die Computerarchitektur 16-Bit ist, bedeutet dies, dass sie 2^16 Speicherplätze haben kann. Daher für a Zeiger um jeden Speicherplatz in diesem Computer speichern zu können, sollte er 16 Bit breit sein, dh 2 Byte (8 Bit = 1 Byte). In ähnlicher Weise benötigen wir für 32-Bit- und 64-Bit-Architekturen Zeiger mit einer Größe von 4 Bytes (32-Bit-Breite) bzw. 8 Bytes (64-Bit-Breite).
Auch wenn ein System 16-Bit ist, dann kann es keinen Adressort mit einer Größe von mehr als 16 Bit haben.

Benutzer-Avatar
Darren Stone

Dadurch erfahren Sie, wie viele Bytes benötigt werden, um einen Zeiger auf Ihrem System darzustellen.

    #include <stdio.h>
    int main() {
        printf("%ld bytes per pointer\n", sizeof(void *));
    }

Hier ist ein Compiler-Flag, mit dem Sie spielen können, das zum Thema gehört:

$ gcc -m32 -o prog32 prog.c
$ gcc -m64 -o prog64 prog.c

Die erste Zeile generiert eine Binärdatei für eine 32-Bit-Umgebung und gibt Ihnen 4-Byte-Zeiger. Die zweite Zeile generiert eine Binärdatei für eine 64-Bit-Umgebung und gibt Ihnen 8-Byte-Zeiger. Sie können dies bestätigen, indem Sie das obige Programm ausführen.

Angenommen, Sie befinden sich auf einem 64-Bit-System mit GCC. Hoffe, das klärt die Dinge ein wenig.

  • Zeiger enthalten Adressen, und sie selbst haben Adressen, also nicht ganz dasselbe. Auch 16-Bit-Systeme können mehr als 64 KB Speicher haben, daher ist Ihre zweite Aussage falsch.

    – Mark Tolonen

    24. Dezember 2013 um 16:51 Uhr


  • @MarkTolonen, ja, guter Punkt. Meine Absicht war es, @GovernmentFX von dieser Vorstellung wegzuführen “Zeiger benötigen 2 Bytes und Adressen benötigen mehr als 2 Bytes.” Das meinte ich mit “die Zeiger sind die Adressen und das ist alles.” Um auf eine hinzuweisen intbraucht man zum Beispiel nur einen Zeiger. Dass ist die Adresse. Danke, denn OP sollte auch verstehen, dass man eine Adresse an eine Adresse an eine Adresse usw. haben kann.

    – Darren Stone

    24. Dezember 2013 um 16:59 Uhr


  • @MarkTolonen, ja, man kann über die Funktionen der C-Sprache hinausgehen und Bibliotheken oder andere Techniken verwenden, um eine beliebige Menge an Speicher auf einem 16-Bit-System anzusprechen. Ich sehe den Kontext dieser Frage jedoch als reine C- und Zeigerfrage, da sie so gekennzeichnet ist. Ich bleibe bei meiner Aussage, dass man mit einer 16-Bit-Adresse 2^16 Bytes Speicher adressieren kann in C. Es ist jetzt zu nah an Weihnachten, also gebe ich zu und ich habe meine Antwort bearbeitet, um es OP einfach zu halten, hoffentlich ein bisschen mehr darüber zu erfahren, wie Zeiger gespeichert werden und wie er dies praktisch überprüfen kann. Prost. 🙂

    – Darren Stone

    24. Dezember 2013 um 17:14 Uhr

Benutzer-Avatar
costik2020

Ich werde versuchen, Ihnen eine ungefähre Vorstellung zu geben. Aber es gibt Ausnahmen von der “Regel”.

  1. Bedeutet dies also, dass, wenn wir uns beispielsweise auf einem 64-Bit-System befinden, die Adresse höchstens 8 Bytes benötigt?
  • Ja, wenn es sich um ein 64-Bit-System handelt, bedeutet dies, dass (in den meisten Fällen) 64 Bit vorhanden sind, die die RAM-Hauptspeicheradressen darstellen.
  1. Wenn wir uns auf einem 16-Bit-System befinden und Zeiger 2 Bytes benötigen und die Adresse mehr 2 Bytes benötigt, um platziert zu werden, was passiert dann?
  • Ich nehme an, Sie beziehen sich auf die Zuweisung von Speicherzellen. Wenn dies der Fall ist, können Sie so viel Speicher zuweisen, wie Sie möchten, dies ist kein Problem. Wenn Ihr System beispielsweise eine 16-Bit-Zeigeradresse hat, können Sie 512 Bit zuweisen.

  • Zeiger enthalten Adressen, und sie selbst haben Adressen, also nicht ganz dasselbe. Auch 16-Bit-Systeme können mehr als 64 KB Speicher haben, daher ist Ihre zweite Aussage falsch.

    – Mark Tolonen

    24. Dezember 2013 um 16:51 Uhr


  • @MarkTolonen, ja, guter Punkt. Meine Absicht war es, @GovernmentFX von dieser Vorstellung wegzuführen “Zeiger benötigen 2 Bytes und Adressen benötigen mehr als 2 Bytes.” Das meinte ich mit “die Zeiger sind die Adressen und das ist alles.” Um auf eine hinzuweisen intbraucht man zum Beispiel nur einen Zeiger. Dass ist die Adresse. Danke, denn OP sollte auch verstehen, dass man eine Adresse an eine Adresse an eine Adresse usw. haben kann.

    – Darren Stone

    24. Dezember 2013 um 16:59 Uhr


  • @MarkTolonen, ja, man kann über die Funktionen der C-Sprache hinausgehen und Bibliotheken oder andere Techniken verwenden, um eine beliebige Menge an Speicher auf einem 16-Bit-System anzusprechen. Ich sehe den Kontext dieser Frage jedoch als reine C- und Zeigerfrage, da sie so gekennzeichnet ist. Ich bleibe bei meiner Aussage, dass man mit einer 16-Bit-Adresse 2^16 Bytes Speicher adressieren kann in C. Es ist jetzt zu nah an Weihnachten, also gebe ich zu und ich habe meine Antwort bearbeitet, um es OP einfach zu halten, hoffentlich ein bisschen mehr darüber zu erfahren, wie Zeiger gespeichert werden und wie er dies praktisch überprüfen kann. Prost. 🙂

    – Darren Stone

    24. Dezember 2013 um 17:14 Uhr

1179230cookie-checkWie viele Bytes nehmen Zeiger ein?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy