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.
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!
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.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.
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, undint16_t
ist garantiert 16 Bits usw.
Sehen Sie sich diese Frage an.