Forum: PC-Programmierung Pointer Größe nur 4 Byte bei 64 Bit Betriebssystem


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Simon (Gast)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ist das hier normal? Laut meinem Lehrbuch steht folgendes:
Ein Zeiger ist eine Variable, die eine Adresse speichert. Wird der Operator sizeof
auf ein Feld angewendet (sizeof(feld)), erhält man den Speicherverbrauch des Feldes in Bytes.
Wird der Operator sizeof auf einen Zeiger angewendet, erhält man die Anzahl der Bytes, die zur Spei-
cherung einer Adresse auf der jeweils zu Grunde liegenden Rechnerarchitektur benötigt werden.Auf einer 32-Bit Rechnerarchitektur 4, auf einer 64-Bit Rechnerarchitektur 8 Bytes.
int main()
{
    long var = 22;
    long *ptr = &var;

    printf("Groesse von ptr = %d", sizeof(ptr));

}

von Georg A. (georga)


Bewertung
0 lesenswert
nicht lesenswert
Wie/womit hast du das compiliert?

von zitter_ned_aso (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Simon schrieb:
> printf("Groesse von ptr = %d", sizeof(ptr));

probiere mal mit
printf("Groesse von ptr = %zu", sizeof(ptr));


von foobar (Gast)


Bewertung
-1 lesenswert
nicht lesenswert
Tja, das zeigt dir, dass entweder dein Rechner eine 32-Bit CPU hat oder 
eine 64-Bit CPU, die im 32-Bit-Modus läuft.

Viele 64-Bit CPUs (insb alle x86) können auch, so es das Betriebssystem 
unterstützt (Win tut es), auch in einem 32-Bit Modus betrieben werden.

von Bobby X (Gast)


Bewertung
0 lesenswert
nicht lesenswert
foobar schrieb:
> Tja, das zeigt dir, dass entweder dein Rechner eine 32-Bit CPU hat
> oder
> eine 64-Bit CPU, die im 32-Bit-Modus läuft.

Stimmt nicht.

Es zeigt, dass der Compiler den Source Code für ein 32 bit System 
compiliert. Welche CPU der Rechner auf dem compiliert wird hat oder 
welche CPU das System später haben wird, auf dem das Programm läuft, 
spielt hier keine Rolle.

von cppbert (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Simon schrieb:
> Auf einer 32-Bit Rechnerarchitektur 4, auf einer 64-Bit
> Rechnerarchitektur 8 Bytes.

ein 32Bit Programm kann nicht magisch 64Bit Speicher adressieren

von Programmierer (Gast)


Bewertung
1 lesenswert
nicht lesenswert
Bobby X schrieb:
> Welche CPU der Rechner auf dem compiliert wird hat oder
> welche CPU das System später haben wird, auf dem das Programm läuft,
> spielt hier keine Rolle.

Korrekt. Genauer gesagt, ersetzt der Compiler Ausdrücke der Form 
"sizeof XY" beim Kompilieren mit einer Konstanten. In der Programmdatei 
steht da also fest 4, 8, oder was auch immer. Sofern die CPU und OS 
das Programm mit oder ohne Kompatibilitätsmodus ausführen können, ist 
die Ausgabe also immer die selbe. Da ist keine dynamische Abfrage drin.

Simon schrieb:
> Ist das hier normal? Laut meinem Lehrbuch steht folgendes:

Was ist das denn für ein Compiler, wo hast du den her? In Lehrbüchern 
wird gerne mal antike Software genutzt, welche z.B. kein 64bit kennt.

Simon schrieb:
> printf("Groesse von ptr = %d", sizeof(ptr));

Das ist übrigens falsch, es muss "%zu" sein und nicht "%d", denn 
"sizeof" gibt den Typ "size_t" zurück, welcher (insb. eben bei 
64bit-Systemen) größer als "int" sein kann, und "%d" erwartet "int". Für 
size_t daher "%zu". Dein Lehrbuch scheint also nicht sehr gut zu sein.

von A. S. (achs)


Bewertung
0 lesenswert
nicht lesenswert
Warum muss eine 64bit CPU auch einen 64bit Adressraum haben?

Oder ein warum sollte sie.

von cppbert (Gast)


Bewertung
0 lesenswert
nicht lesenswert
A. S. schrieb:
> Oder ein warum sollte sie.

weil es öfters so ist?

von Imonbln (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Simon schrieb:
> Wird der Operator sizeof
> auf ein Feld angewendet (sizeof(feld)), erhält man den Speicherverbrauch
> des Feldes in Bytes.

Das ist so nicht ganz korrekt, sizeof gibt dir den Speicherverbrauch des 
Feldes als Vielfaches von char. Der C-Standard iso9899:1999 garantiert 
dir das sizeof(char) == 1 ist. Er garantiert dir aber nicht das char 
immer exakt ein Byte hat. (Auch wenn es in der Praxis wohl bei 95% aller 
Systemen so ist) streng genommen könnten es auch 2 Bytes sein oder 5.

Simon schrieb:
> Rechnerarchitektur benötigt werden.Auf einer 32-Bit Rechnerarchitektur
> 4, auf einer 64-Bit Rechnerarchitektur 8 Bytes.

Hast du das Programm einmal für 32 Bit kompiliert & einmal für 64 Bit. 
Die meisten modernen 64 Bit Maschinen können auch 32 Bit Programme 
ausführen und weil sizeof(ptr) beim Kompilieren bekannt ist, wird der 
Compiler das Evaluieren und fest in Binary schreiben und nicht zu 
Laufzeit berechnen.

von Programmierer (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Imonbln schrieb:
> Er garantiert dir aber nicht das char immer exakt ein Byte hat

Doch! Im Standard ist 1 char = 1 Byte fest definiert. Allerdings ist die 
Anzahl Bits in einem byte nicht unbedingt 8, sondern kann auch größer 
sein.

von georg (Gast)


Bewertung
0 lesenswert
nicht lesenswert
A. S. schrieb:
> Warum muss eine 64bit CPU auch einen 64bit Adressraum haben?

Was genau heisst "haben"? Logischer und physikalischer Adressraum sind 
nicht dasselbe.

Georg

von Rolf M. (rmagnus)


Bewertung
0 lesenswert
nicht lesenswert
Simon schrieb:
> Auf einer 32-Bit Rechnerarchitektur 4, auf einer 64-Bit Rechnerarchitektur 8
> Bytes.

So allgemein kann man das nicht sagen. Aber in der Regel ist es so.

Bobby X schrieb:
> foobar schrieb:
>> Tja, das zeigt dir, dass entweder dein Rechner eine 32-Bit CPU hat
>> oder eine 64-Bit CPU, die im 32-Bit-Modus läuft.
>
> Stimmt nicht.
> Es zeigt, dass der Compiler den Source Code für ein 32 bit System
> compiliert.

Und zur Ausführung des Programms wird der Prozessor vorübergehend in den 
32-Bit-Modus geschaltet.

> Welche CPU der Rechner auf dem compiliert wird hat oder welche CPU das
> System später haben wird, auf dem das Programm läuft, spielt hier keine
> Rolle.

Nun, auf einer 32-Bit-Architektur wird ein 64-Bit-Programm nicht laufen; 
auf einer 64-Bit-Architektur läuft ein 32-Bit-Programm nur, wenn das 
sowohl die Hardware, als auch das Betriebssystem das unterstützt Von 
daher spielt es offenbar sehr wohl eine Rolle.

A. S. schrieb:
> Warum muss eine 64bit CPU auch einen 64bit Adressraum haben?

Sie muss nicht. Aber kennst du eine gängige CPU-Architektur, bei der das 
nicht so ist?

> Oder ein warum sollte sie.

Das wird im allgemeinen als der größte Vorteil von 64-Bit-Architekturen 
gesehen. Der größere Adressraum ist der Hauptgrund, weshalb man PCs auf 
64 Bit umgestellt hat, weshalb man inzwischen auch schon die Handys auf 
64 Bit umgestellt.

Imonbln schrieb:
> Simon schrieb:
>> Wird der Operator sizeof
>> auf ein Feld angewendet (sizeof(feld)), erhält man den Speicherverbrauch
>> des Feldes in Bytes.
>
> Das ist so nicht ganz korrekt,

Doch, das ist absolut korrekt.

> sizeof gibt dir den Speicherverbrauch des Feldes als Vielfaches von char.
> Der C-Standard iso9899:1999 garantiert dir das sizeof(char) == 1 ist. Er
> garantiert dir aber nicht das char immer exakt ein Byte hat.

Doch, tut er - explizt. Er garantiert dir nur nicht, dass ein Byte genau 
8 Bit hat. Ein Byte darf auch 9 oder 12 oder 32 Bit breit sein, es darf 
nur nicht kleiner als 8 Bit sein.

von Bobby X (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Rolf M. schrieb:

> Bobby X schrieb:
>> foobar schrieb:
>>> Tja, das zeigt dir, dass entweder dein Rechner eine 32-Bit CPU hat
>>> oder eine 64-Bit CPU, die im 32-Bit-Modus läuft.
>>
>> Stimmt nicht.
>> Es zeigt, dass der Compiler den Source Code für ein 32 bit System
>> compiliert.
>
> Und zur Ausführung des Programms wird der Prozessor vorübergehend in den
> 32-Bit-Modus geschaltet.
>
>> Welche CPU der Rechner auf dem compiliert wird hat oder welche CPU das
>> System später haben wird, auf dem das Programm läuft, spielt hier keine
>> Rolle.
>
> Nun, auf einer 32-Bit-Architektur wird ein 64-Bit-Programm nicht laufen;
> auf einer 64-Bit-Architektur läuft ein 32-Bit-Programm nur, wenn das
> sowohl die Hardware, als auch das Betriebssystem das unterstützt Von
> daher spielt es offenbar sehr wohl eine Rolle.

Die Programmiersprache, C in diesem Fall, "weiss nicht" auf welcher 
Platform, CPU usw.... das in ihr geschriebene Programm laufen wird. Die 
Programmiersprache selbst und ihre Implementierung/Ausführungsbedinungen 
auf jeweiligen Platformen sind zwei verschiedene Dinge.

Ähnlich ist es mit den calling convention. Das was in C ein 
Funktionsaufruf ist, kann auf verschiedene Art und weise realisiert 
werden. Aus Sicht von C ist das aber stets "nur" ein Funktionsaufruf.

von Rolf M. (rmagnus)


Bewertung
0 lesenswert
nicht lesenswert
Bobby X schrieb:
>> Nun, auf einer 32-Bit-Architektur wird ein 64-Bit-Programm nicht laufen;
>> auf einer 64-Bit-Architektur läuft ein 32-Bit-Programm nur, wenn das
>> sowohl die Hardware, als auch das Betriebssystem das unterstützt Von
>> daher spielt es offenbar sehr wohl eine Rolle.
>
> Die Programmiersprache, C in diesem Fall, "weiss nicht" auf welcher
> Platform, CPU usw.... das in ihr geschriebene Programm laufen wird.

Natürlich nicht, aber worauf willst du hinaus? Es geht hier um die 
Ausgabe, die ein für eine spezifische Plattform generiertes Programm bei 
seiner Ausführung produziert hat. Dort war die Größe eines Zeigers 4 
statt der erwarteten 8 Bytes.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.