Warum ist sizeof(int) anders als sizeof(int*)?
Frage ich mich, warum in dem folgenden Programm sizeof(int)
einen anderen Wert zurückgibt als sizeof(int*)
.
Hier ist das kleine Programm:
int main(){
std::cout<<sizeof(int)<<endl;
std::cout<<sizeof(int*)<<endl;
return 0;
}
Und hier ist die Ausgabe:
4
8
Bis jetzt erinnere ich mich an die Größe eines integer-Zeigers 4byte(gcc-compiler). Wie kann ich überprüfen Sie die korrekte Größe ein Zeiger? Ist es computer abhängig?
Bin ich unter ubuntu 12.04
# lsb_release -a
Distributor ID: Ubuntu
Description: Ubuntu 12.04 LTS
Release: 12.04
Codename: precise
Ist die Größe der Zeiger nicht konstant ist(standard-Größe) 8 bytes.
- 64-bit-Betriebssystem?
- Sind Sie sicher, dass alle Zeiger sind garantiert die gleiche Größe?
- Auch die Ausgabe von
uname -a
oderfile <your-compiled-binary>
- FYI, es gibt keine "Standard-Größe".
- Zeiger auf die verschiedenen Arten müssen nicht die gleiche Größe haben.
- Charlesworth : Könnte ich ein Beispiel sehen im code. Ich bin mir nicht sicher, auf die Frage jetzt.
- mögliche Duplikate von sizeof void-Zeiger
- Seine einfache. int ist 4 Byte, weil es ein 32-bit-Wert. int* ist 8 bytes, weil seine Adresse im Speicher. Es noch hält nur 32-bit an Informationen.
- Es gibt keine Garantie, dass alle Zeiger haben die gleiche Größe. Ich habe gearbeitet, auf Maschinen, auf denen
char*
war größer alsint*
, und auf Maschinen (Intel 8086), wo Funktion Zeiger hatte eine andere Größe aus den Daten-Pointer. - Es ist Plattform-abhängig. Die kanonischen Beispiele sind near-und far-Zeigern, oder heterogen code und Daten Zeiger auf eine Harvard-Architektur.
- Ah, ich sehe. Vielen Dank für die Klarstellung.
- noch hält nur 32-bit an Informationen." Was?
- Wichtige Frage: warum hätten Sie erwartet, dass Sie die gleiche sein?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Größe eines
int
und einint*
sind komplett von compiler und hardware abhängig ist. Wenn Sie sehen, acht bytes in einemint*
Sie wahrscheinlich ein 64-bit-hardware, die sich in acht bytes pro Zeiger.Hoffe, das hilft!
char
.sizeof(char)
ist immer1
char
ist eigentlich nicht durch eine Norm definiert, abersizeof
express Ergebnisse in Anzahl der Zeichen.char
ist ein byte, sondern ein byte die Größe wird durch die Implementierung definiert.sizeof(char) == 1
Gibt es keine anderen Garantien(*).
In der Praxis Zeiger wird die Größe 2 auf einem 16-bit-system, 4 auf einem 32-bit system und 8 auf eine 64-bit-system.
(*) Siehe auch den Kommentar von James Kanze.
sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long)
ist auch garantiert. Wie istsizeof(float) <= sizeof(double) <= sizeof(long double)
. (Es gibt auch eine Garantie, dass alle Größen sind fester, aber das ist mehr oder weniger verstanden.)Die Größe einer Zeiger-system, compiler und von der Architektur abhängig. Auf 32-bit-Systeme wird es in der Regel 32 bit, während auf 64-bit-Systeme Sie werden in der Regel 64 bits.
Wenn du beim speichern einen Zeiger in eine Ganzzahl für die spätere Wiederherstellung der Zeiger wieder können Sie den Typ
intptr_t
die ein integraler Typ groß genug zu halten (glaube ich) normal (ohne Funktion) Zeiger-Typen.und
Sehen diese Frage.
int8_t
etc. vorhanden. Für maximale Portabilität, nutzen Sie einfachint
, es sei denn, Sie wissen, Sie brauchen etwas größer, aus und bestätigen Ihre Eingabe.<stdint.h>
,int8_t
et al. sind als optional gekennzeichnet. In der C-standard, ich denke, Sie sind "erforderlich", wenn die hardware Sie unterstützt; das ist jedenfalls die Absicht. Aber Sie müssen die genaue Größe, Arten, und die unterzeichneten müssen 2 ergänzen. Auf Maschinen, die keine 8-bit-bytes, oder die nicht 2 ergänzen, Sie werden nicht definiert. (Posix erfordert, die Grenzen der hardware, auf der es implementiert werden kann.)