2011-01-01 5 views
8

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?

+4

Wahrscheinlich eine Stapelüberlauf Frage. – Orbling

+0

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

+1

mögliches Duplikat von [sizeof (int) == sizeof (void \ *)?] (http://stackoverflow.com/questions/502811/sizeof- int-sizeof-void) – Amro

Antwort

16

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.

1

nein, aber ein Zeiger sollte die gleiche Größe wie ein intptr_t haben.

+0

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

+1

@ 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

+2

-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. –

1

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

+2

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). –

+0

@Joe du hast recht, ich hätte meine Antwort auf die relative Größe von int und pointer beschränken sollen. – Gaurav

+0

@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

3

Nein, vor allem in 64-Bit-Umgebungen:

LP64 Dies umfasst * nichts-Umgebungen, aber das gleiche ist in den Fenstern für LLP64 wahr.

5

Nein, überhaupt nicht. Viele Compiler haben sie nicht in der gleichen Größe.

1

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.

-2

Ich glaube, der Linux-Kernel übergibt Zeiger als unsigned long's. Sie sind garantiert mindestens so groß wie ein Zeiger :)

+3

No. Linux garantiert, dass sie die gleiche Größe haben. Die Sprache C macht keinerlei Versprechen. –

+0

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

Verwandte Themen