Warum ist sizeof (int) anders als sizeof (int *)?

7

Ich frage mich, warum im folgenden Programm sizeof(int) einen anderen Wert als sizeof(int*) zurückgibt.

Hier ist das kleine Programm:

%Vor%

Und hier ist die Ausgabe:

%Vor%

Bis jetzt erinnere ich mich an die Größe eines Ganzzahlzeigers ist 4byte (GCC-Compiler). Wie kann ich die korrekte Größe eines Zeigers überprüfen? Ist es computerabhängig?

Ich führe ubuntu 12.04

%Vor%

Ist die Größe des Zeigers nicht konstant (Standardgröße) 8 Bytes.

    
yogi 11.06.2012, 17:18
quelle

4 Antworten

15

Die Größe von int und int* ist vollständig vom Compiler und der Hardware abhängig. Wenn Sie acht Byte in einem int* verwenden, haben Sie wahrscheinlich 64-Bit-Hardware, die in acht Bytes pro Zeiger übersetzt.

Hoffe, das hilft!

    
templatetypedef 11.06.2012, 17:20
quelle
7

sizeof(char) == 1

Es gibt keine anderen Garantien (*).

In der Praxis werden Zeiger auf einem 16-Bit-System auf Größe 2, auf einem 32-Bit-System auf 4 und auf einem 64-Bit-System auf 8 gesetzt.

(*) Siehe den Kommentar von James Kanze.     
gliderkite 11.06.2012 17:22
quelle
4

Die Größe eines Zeigers ist system-, compiler- und architekturabhängig. Bei 32-Bit-Systemen sind es typischerweise 32 Bit, bei 64-Bit-Systemen typischerweise 64 Bit.

Wenn Sie versuchen, einen Zeiger für eine spätere Wiederherstellung in den Zeiger zu speichern, können Sie den Typ intptr_t verwenden, der ein integraler Typ ist, der groß genug ist, um (wie ich glaube) einen normalen (nicht funktionsfähigen) Zeiger zu halten Typen.

    
Mark B 11.06.2012 17:21
quelle
2
  

Für 32-Bit-Systeme ist der De-facto-Standard ILP32 - das heißt int,   lang und Zeiger sind alle 32-Bit-Mengen.

     

Für 64-Bit-Systeme lautet der De-facto-Standard von Unix LP64 -   long und pointer sind 64-bit (aber int ist 32-bit). Das Windows 64-Bit   Standard ist LLP64 - lang lang und Zeiger sind 64-Bit (aber lang und int   sind beide 32-Bit).

     

Zu einem bestimmten Zeitpunkt verwendeten einige Unix-Systeme eine ILP64-Organisation.

     

Keiner dieser De-facto-Standards ist durch den C-Standard gesetzlich festgelegt   (ISO / IEC 9899: 1999), aber alle sind damit erlaubt.

und

  

Wenn Sie sich mit der Portabilität befassen oder den Namen des   Typ gibt die Größe wieder, Sie können die Kopfzeile sehen, wo   Folgende Makros stehen zur Verfügung:

     

int8_t int16_t int32_t int64_t

     

int8_t hat garantiert 8 Bit, und int16_t ist garantiert 16   Bits usw.

Sehen Sie sich diese Frage an.

    
user195488 11.06.2012 17:24
quelle

Tags und Links