Kann man beim Entwurf einer neuen Programmiersprache annehmen, dass ein C int und ein Zeiger auf der Maschine dieselbe Größe haben?Ist es sicher anzunehmen, dass ein Zeiger die Größe eines int in C hat?
Antwort
Nein. Ein Zeiger kann größer oder kleiner als eine ganze Zahl sein. Wenn Sie aus irgendeinem Grund einen Zeiger als Integer übergeben müssen (z. B. Ganzzahl statt Zeiger, Arithmetik), passen sie garantiert in eine intptr_t.
Sie passen nicht garantiert in eine size_t wie in einer anderen Antwort vorgeschlagen, aber in der Praxis ist es unwahrscheinlich, dass sie nicht, da die größte adressierbare Größe in der Regel gleich der größten adressierbaren Adresse ist.
nein, aber ein Zeiger sollte die gleiche Größe wie ein intptr_t haben.
Es scheint, dass sizeof (int)! = sizeof (int *) mit der Maschine und dem Compiler, die ich gerade benutze ... wenn also etwas Ähnliches sicher ist, ist es nicht int . – compman
@ user9521: Wie Dan sagt, verwende immer die 'size_t' Typen. Das Hauptproblem bei der Konvertierung von Code in x64 ist die Prävalenz von Personen, die davon ausgehen, dass die int-Größe gleich ist und diese Praxis vor vielen Jahren aufgegeben wurde. – Orbling
-1 - De facto sind Sie wahrscheinlich richtig, aber de jure Sie sind falsch. Bei segmentierten (und anderen Arten von pathologischen) Speicherarchitekturen kann size_t kleiner als intptr_t sein. http://stackoverflow.com/questions/1464174/size-t-vs-intptr-t. –
Ich denke, du meinst Größe der Datentypen wie von der Plattform nicht C lang definiert. Soweit ich weiß, definiert C keine bestimmte Größe für die Datentypen. Die Antwort auf Ihre Frage ist, dass Sie dies nicht annehmen können, zum Beispiel On win32 sizeof (int) == sizeof (Zeiger) == 4 Bytes jedoch auf win64 sizeof (int) == 4 und sizeof (Zeiger) == 8
Die Sprache C definiert mehrere minimale Datengrößen (z. B. size_t muss mindestens 16 Bit sein), relationale Größen (long kann nicht kürzer als short sein) sowie einige Typen fester Größe (uint32_t ist genau 32 Bit). –
@Joe du hast recht, ich hätte meine Antwort auf die relative Größe von int und pointer beschränken sollen. – Gaurav
@Joe: Es scheint, dass uint32_t zum ersten Mal im C-Standard in C99 auftauchte (siehe http://en.wikipedia.org/wiki/Stdint.h), denn dann wurde stdint.h Teil des Standards. (Ich weiß nicht, ob Implementierungen es manchmal vor C99 bereitstellen würden.) – compman
Nein, vor allem in 64-Bit-Umgebungen:
LP64 Dies umfasst * nichts-Umgebungen, aber das gleiche ist in den Fenstern für LLP64 wahr.
Nein, überhaupt nicht. Viele Compiler haben sie nicht in der gleichen Größe.
Nein; auf meinem MacOS X 10.6.5. Maschine, ein int
ist 32 Bits und ein Zeiger ist standardmäßig 64 Bits.
Wenn Sie eine ganze Zahl benötigen, die die richtige Größe ist auch einen Zeiger zu halten, verwenden #include <inttypes.h>
(oder <stdint.h>
) und uintptr_t
- vorausgesetzt, Sie haben C99-Unterstützung, oder kann es simulieren.
Ich glaube, der Linux-Kernel übergibt Zeiger als unsigned long's. Sie sind garantiert mindestens so groß wie ein Zeiger :)
No. Linux garantiert, dass sie die gleiche Größe haben. Die Sprache C macht keinerlei Versprechen. –
Dies ist eigentlich eine gute Antwort, weil es etwas Kernel-Verhalten und ihre Missachtung von C-Sprachregeln zeigt. Es verursacht Fehler im wirklichen Leben, wie OpenSSL [Bug 4441: VIA C7-D-Prozessor: Hang in 30-test_afalg.t] (https://rt.openssl.org/Ticket/Display.html?id=4441). Es scheint so zu sein, weil der Kernel Zeiger (i686, 32-Bit) auf Integrale größerer Größe (vorzeichenlos lang und dann in einem '__u64' gespeichert) wirft. – jww
- 1. Ist es sicher anzunehmen, dass ein Server PHP 5 hätte?
- 2. Ist es sicher anzunehmen, dass eine GUID immer eindeutig ist?
- 3. Gibt es Zeiger in C# wie C++? Ist es sicher?
- 4. Wie sicher ist es anzunehmen, dass die meisten Benutzer JS aktiviert haben?
- 5. Ist es sicher anzunehmen, dass der Operator == immer daran arbeitet, das Wörterbuch in Python zu vergleichen?
- 6. C++ - Methode, die einen Zeiger nimmt aber ein int
- 7. Gleichzeitige Lesezugriff auf ein int [] Array: Ist es sicher? Ist es schnell?
- 8. Ist dies sicher anzunehmen, dass es sich nicht um https handelt?
- 9. Ist es vernünftig anzunehmen, dass meine Besucher JavaScript aktiviert haben?
- 10. -Fomit-Frame-Zeiger, ist es sicher, es zu benutzen?
- 11. Ist es sicher, ein boolesches Flag zu verwenden, um die Ausführung eines Threads in C#
- 12. Ist es möglich, dass das Kind eines div auf Zeiger-Ereignisse gesetzt ist: Keiner hat Zeiger-Ereignisse?
- 13. Ist es üblich, dass Strukturmitglieder Zeiger in Golang sind?
- 14. "Fehler: Anfrage für Mitglieder 'Größe' in 'a', die von Zeigertyp ist" aber ich dachte nicht, dass es ein Zeiger war
- 15. Was ist die Größe eines SQL Int (N)?
- 16. Ist der numerische Wert von DayOfWeek sicher anzunehmen?
- 17. Dynamisch Zeiger falsche Größe auf int geben
- 18. Ist es sicher, Zeiger auf Elemente in Datenstrukturen zu haben? (C++ mit QT)
- 19. So stellen Sie sicher ein Int ist 4 Bytes oder 2 Bytes in C/C++
- 20. Was ist die maximale Größe für ein int in PHP?
- 21. Gibt es einen integrierten Typ, der die gleiche Größe und Ausrichtung wie ein Zeiger hat?
- 22. Welche Java-Versionen werden häufig in Browsern installiert, ist es sicher, 1.4 anzunehmen?
- 23. Zeiger eines Zeichens in C++
- 24. Zeiger auf int-Wert setzen
- 25. Segfault einen int-Zeiger in c aktualisieren
- 26. Was ist ein Singleton Zeiger in C?
- 27. erkennt automatisch, dass ein Typ ein Zeiger ist?
- 28. C++ Warum ist es nicht die gleiche Adresse (Zeiger)
- 29. C++/OpenGL - Zeiger eines Arrays
- 30. Ist es möglich, dass ein Bild mehrere Tags hat?
Wahrscheinlich eine Stapelüberlauf Frage. – Orbling
Siehe auch: [C++: Ist es sicher, Zeiger auf int und später wieder auf den Zeiger zu werfen?] (Http://stackoverflow.com/questions/3567905/c-is-it-safe-to-cast-pointer- to-int-and-later-back-to-pointer-wieder) – Shog9
mögliches Duplikat von [sizeof (int) == sizeof (void \ *)?] (http://stackoverflow.com/questions/502811/sizeof- int-sizeof-void) – Amro