Was passiert eigentlich, wenn ein Zeiger auf integer gecastet wird, um einen Zeiger auf char?
int i=40;
char *p;
p=(char *)&i;//What actually happens here?
printf("%d",*p);
Was wird der Ausgang? Bitte um Hilfe!!
Der Titel deiner Frage spricht über Umwandlung eines integer in ein char-Zeiger, aber das ist nicht das, was Ihr code tut. Es ist ein casting int Zeiger auf einen char Zeiger.
InformationsquelleAutor vas | 2010-09-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nimmt es die Adresse von
i
und wirft es zu einerchar
Zeiger. Also der Wert von*p
ist jetzt das erste byte deri
. Was das Wert ist, ist Plattform abhängig.Warum ist cast erforderlich , was ist der Unterschied zwischen
char *p = (char *) &i
undchar *p = &i
?InformationsquelleAutor sepp2k
Beginnen wir, indem wir schauen, wie der Inhalt
i
undp
wäre im Speicher angeordnet (vorausgesetzt, big-endian-Reihenfolge):Seit
p
wird erklärt, wie eine auto-variable nicht initialisiert zu nichts und enthält ein zufälliges bit-Muster, vertreten durch0x??
.In der Zeile
den Ausdruck
&i
wertet die Adresse voni
oder 0x08000000, und sein Typ istpointer to int
oderint *
. Der cast wandelt den Typ ausint *
zuchar *
, und das Ergebnis zugewiesen wird, ump
.Hier ist, wie Dinge Aussehen im Speicher nach der Zuordnung:
Also der Wert von
p
ist jetzt die Adresse voni
. In der Zeileden Typ des Ausdrucks
*p
istchar
, und sein Wert ist unabhängig gespeichert in Adresse 0x08000000, die in diesem Fall 0 ist. Daprintf
ist eine Variable Funktion, die den Wert*p
wird gefördert vom Typchar
zu gebenint
.Also für diesen speziellen Fall, der Ausgang ist "0". Wenn die Reihenfolge little-endian, die Karte würde wie folgt Aussehen
und die Ausgabe "40".
Beachten Sie, dass dieses ganze Beispiel wird davon ausgegangen, dass integer-und character-Zeiger haben die gleiche Größe und layout; das ist nicht garantiert, um wahr zu sein, überall (siehe die Online-C-Standard (n1256 Entwurf), Abschnitt 6.2.5, Absatz 27), so können Sie sich nicht darauf verlassen, dass diese arbeiten von überall die Art und Weise, die Sie erwarten (vorausgesetzt, dass ich richtig bin in der Annahme, dass
int
undchar
sind nicht-kompatible Typen, definiert durch den standard, aber ich könnte falsch sein). Typ Zweideutigkeiten im Allgemeinen ist das sicher nicht.int*
undchar*
Zeiger haben die gleiche Größe und layout, aber auch das sichtbare Verhalten des Programms nicht. Der C-Standard garantiert, dass alle Objekte zugegriffen werden kann wie ein array von Zeichen, also den OP-code wird der Zugang der ersten (untersten angesprochen) bytei
. Der Wert der byte, wie andere haben darauf hingewiesen -, hängt von der Implementierung.Warum ist cast erforderlich , was ist der Unterschied zwischen
char *p = (char *) &i
undchar *p = &i
?Warum ist cast erforderlich , was ist der Unterschied zwischen
char *p = (char *) &i
undchar *p = &i
?Der Unterschied ist, dass
char *p = (char *) &i;
islegal, undchar *p = &i;
ist nicht. Es gibt keine implizite Konvertierung zwischenchar*
undint*
(obwohl einige Compiler erlauben es, vorzugsweise mit einer Warnung). Zeiger Konvertierungen können gefährlich sein, lassen Sie behandeln Sie ein Objekt des Typs als wäre es eine andere Art, damit die Sprache erfordert eine solche Konvertierungen explizite.Wenn der compiler erlaubt es, mit einem waring , wie "Initialisierung von inkompatiblen Typ" dann sind Sie gleich , tun, Verhalten Sie sich gleich. Das nervt mich schon sehr lange.
InformationsquelleAutor John Bode
hier sind Sie
int i = 40;
//allokierung von Speicher für die Ganzzahl i und die Zuweisung mit dem Wert 40 zualso hier definieren Sie einen Zeiger-variable und Zuweisung der Adresse, die ich nach dem Gießen es auf
char*
angenommen
i
zugewiesen1021 address
so p wird die Adresse mit der Grenze von 1 byte so sollte es haltenfirst 8 bit from the representation of 40;
als 40 wurden decken unter die ersten 8 bit 2 byte, es wird halt einen char equivalend 40 aber Sie drucken es mit
%d
es shopuld drucken40
;Warum ist cast erforderlich , was ist der Unterschied zwischen
char *p = (char *) &i
undchar *p = &i
?InformationsquelleAutor Jigar Joshi
Kommt es an. Unter Windows wird die Ausgabe 40, aber das ist nur, weil eine Menge von Zufällen:
Zunächst, printf nicht (kann nicht) überprüfen Sie den Typ Ihrer Argumente, also da sieht Sie %d im Formatstring, es wird davon ausgegangen, dass das gegebene argument ist ein int. Obwohl *p ist nur ein char, das Ergebnis wird gefördert, die einen int-Wert (wie für jedes argument, das nicht in der Funktion angegebenen Prototyp).
Zweite, p-Punkt, um den Speicher genommen, die durch die variable i, aber da es ein char-pointer, es dauert nur ein byte aus dem Speicher des ich. Da Windows/Intel verwendet Least-Significant-Byte zuerst übereinkommen, 40 gespeichert werden als byte-Muster "40 0 0 0" so, da *p nimmt das erste byte (char), das Ergebnis wird sein 40. Wenn ich den Wert 256 oder größer, das Ergebnis wäre falsch.
InformationsquelleAutor Patrick
Was passiert, wenn die int-Zeiger ist typecasted char?
Es ist eine andere Frage markiert, dupliziert, hier, ich versuche zu erklären.
Kompilieren und ausführen:
Warum es 513? Wir können verwenden Sie gdb, um zu sehen, die Ursache.
legen Sie einen Haltepunkt in Zeile 8 ein.c, und führen Sie
einmal Programm stop auf break point, print-variable, die eine Speicheradresse.
variable, die eine Speicheradresse ist 0x7fffffffd9d4, und die variable x der Wert ist der gleiche.
vor der show memory content, lassen Sie uns wissen, wie 512 im hex-format, es ist:
- und x86 ist little-endian, also im Speicher sollte es sein:
let ' s show der tatsächliche Speicher, nur als gleiche, als wir dachten.
dann zeigen Speicheradresse von x[0] und x[1], und konvertieren Sie den Speicher Inhalt zu real-Wert, sollte es nicht schwer zu verstehen, warum drucken Sie 513.
InformationsquelleAutor L. Ouyang