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


von Simon (Gast)


Angehängte Dateien:

Lesenswert?

Ist das hier normal? Laut meinem Lehrbuch steht folgendes:
1
Ein Zeiger ist eine Variable, die eine Adresse speichert. Wird der Operator sizeof
2
auf ein Feld angewendet (sizeof(feld)), erhält man den Speicherverbrauch des Feldes in Bytes.
3
Wird der Operator sizeof auf einen Zeiger angewendet, erhält man die Anzahl der Bytes, die zur Spei-
4
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.
1
int main()
2
{
3
    long var = 22;
4
    long *ptr = &var;
5
6
    printf("Groesse von ptr = %d", sizeof(ptr));
7
8
}

von Georg A. (georga)


Lesenswert?

Wie/womit hast du das compiliert?

von zitter_ned_aso (Gast)


Lesenswert?

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

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

von foobar (Gast)


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)


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)


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)


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. (Gast)


Lesenswert?

Warum muss eine 64bit CPU auch einen 64bit Adressraum haben?

Oder ein warum sollte sie.

von cppbert (Gast)


Lesenswert?

A. S. schrieb:
> Oder ein warum sollte sie.

weil es öfters so ist?

von Imonbln (Gast)


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)


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)


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)


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)


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)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.