2016-12-02 3 views
1

Wie ist das in C erlaubt?Casting von malloc auf einen primitiven Typ

int p= (int) malloc (sizeof(int)); 

Ich bekomme nur eine Warnung, wenn ich in gcc kompilieren.

Warnung: Besetzung von Zeiger auf Ganzzahl unterschiedlicher Größe [-Wpointer-to-int-cast]

Ein void-Zeiger kann nicht auf eine primitive Art Recht gegossen werden?

*((int*)(x))//is allowed - assume x is of type void* 

Aber wie ist die direkte Umwandlung in primitive auch zulässig?

+0

Eigentlich können Sie casten. – MrMuMu

+1

ja. Es ist erlaubt, dass Sie einen Zeiger auf ['intptr_t' oder' uintptr_t'] (http://stackoverflow.com/q/6326338/995714) werfen können. –

+0

@ LưuVĩnhPhúc: Die Möglichkeit, Zeiger auf Integer-Typen zu werfen, ist älter als die Existenz von 'intptr_t' und' uintptr_t'. –

Antwort

4

Dies ist nicht verboten, aber Implementierung definiert Verhalten. Zitieren C11, Kapitel §6.3.2.3

Jeder Pointer-Typ kann in einen Integer-Typ konvertiert werden. Außer wie zuvor spezifiziert, ist das Ergebnis implementationsdefiniert. Wenn das Ergebnis nicht im Integer-Typ dargestellt werden kann, ist das Verhalten nicht definiert. Das Ergebnis muss nicht im Bereich von Werten einer Ganzzahl sein.

Deshalb gibt der Compiler die Warnung aus.

Das heißt, unter Angabe Kapitel 7.20.1.4, Integer-Typen fähig Objektzeiger halten, wir intptr_t und uintptr_t haben.

folgender Typ einen vorzeichenbehaftete Ganzzahl-Typ mit der Eigenschaft bezeichnet, dass ein beliebigen gültige Zeiger für ungültig zu erklären kann auf diese Art überführt werden, dann zurück zum Zeiger umgewandelt ungültig, und das Ergebnis wird auf den ursprünglichen Zeiger gleich vergleichen :

auf diesen Typ umgewandelt werden, die jeder gültige Zeiger auf ungültig,

intptr_t

folgenden Typs dann umgewandelt, um eine vorzeichenlose Ganzzahl-Typ mit der Eigenschaft bezeichnet zurück zum Zeiger für ungültig zu erklären, und die resu Es vergleicht gleich dem ursprünglichen Zeiger:

uintptr_t


gesagt haben, dass nur der Vollständigkeit halber willen, lassen Sie mich hinzufügen, dass there is fair amount of reasons on why not to cast the return value of malloc() and family in C..