2016-07-07 6 views
0

Wahr oder falsch: folgende Zuordnung gilt:Zeiger und Typ umgewandelt

#define GIMME *(unsigned int**) 0x3000 
unsigned short d = 42; 
GIMME = &d; 

Diese falsch ist, wenn ich nicht in der Lage bin zu verstehen, warum. Ich habe vor kurzem von Java auf C umgestellt, damit jede Hilfe geschätzt wird.

+3

Wie definieren Sie "gültig"? Es scheint richtig, wenn die Zeilen in einer Funktionsdefinition sind. Die Ganzzahl "0x3000" wird in implementierungsdefinierter Weise in einen Zeiger umgewandelt, und "vorzeichenlose Abkürzung" und "vorzeichenlose Ganzzahl" können die gleiche Ausrichtungsanforderung haben. – MikeCAT

+3

Was möchten Sie tun? –

+2

Dies ist nicht der Code, nach dem Sie suchen. Holen Sie sich stattdessen ein gutes C-Buch. – 2501

Antwort

3

-Code versucht, zwei fragwürdige Dinge:

  1. Zuordnung von Daten zu einig Standort (3000), der nicht bekannt ist, um gültig zu sein.

    *(unsigned int**) 0x3000 = &d; 
    
  2. Versuch, inkompatible Typen zuzuweisen. Die Ausrichtung kann fehlschlagen, da unsigned short schmaler sein kann als unsigned int. IOWs, die 2 Typen können unterschiedliche minimale Ausrichtung Anforderungen haben.

Ein Zeiger auf einen Objekttyp kann zu einem anderen Objekttyp in einen Zeiger umgewandelt werden. Wenn der resultierende Zeiger für den referenzierten Typ nicht korrekt ausgerichtet ist, ist das Verhalten nicht definiert. §6.3.2.3 C11 7

// similar simplified example 
    unsigned short d = 42; 
    unsigned int* gimme; 
    gimme = &d; // warning: assignment from incompatible pointer type 
Verwandte Themen