Dieser Code:
int p = 10;
void *q;
*q = 10;
Lässt sich nicht kompilieren:
'=' : kann nicht von 'int' nach 'void *' konvertieren
Dieser Code lässt sich jedoch problemlos kompilieren:
int p = 10;
void *q;
q = &p;
Was ist der Grund dafür?
Dieser Code:
int p = 10;
void *q;
*q = 10;
Lässt sich nicht kompilieren:
'=' : kann nicht von 'int' nach 'void *' konvertieren
Dieser Code lässt sich jedoch problemlos kompilieren:
int p = 10;
void *q;
q = &p;
Was ist der Grund dafür?
A void *
zeigt auf Daten eines unbekannten Typs (falls er initialisiert ist, was bei Ihnen nicht der Fall ist).
Sie können nur an Variablen eines bekannten Typs oder über Zeiger eines bekannten Typs zuweisen.
int p = 10;
void *q = &p;
*(int *)q = 20;
if (p != 20)
...something has gone horribly wrong...
Dies wandelt die void *
in eine int *
und weist dann diesem dereferenzierten Integer-Zeiger einen Wert zu.
Die beiden Teile des Codes (versuchen), unterschiedliche Dinge zu tun.
Im ersten Fall wird versucht, dem Objekt den Wert 10 zuzuweisen q
zeigt auf. Hier gibt es zwei Probleme. Erstens haben Sie den Zeiger nie initialisiert. Er muss erst irgendwo hin zeigen, bevor Sie den Wert des Zeigers ändern können. Und zweitens können Sie nicht dereferenzieren void*
weil der Typ nicht bekannt ist.
Der zweite Teil des Codes ordnet die Adresse der Variablen p
a q
. Nach diesem q
verweist auf das Objekt, das in p
.
Dadurch wird die Adresse im Speicher geändert q
zeigt auf:
q = &p;
Diese kann nicht herausfinden, welche Art von q
zeigt auf ( int
, long
, std::string
, int**
usw.); es kennt nur den Speicherort:
*q = 10;
Das könnten Sie tun:
int *iq = static_cast<int*>(q);
*iq = 10;
Sie möchten vielleicht mehr lesen über void*
s .
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.
0 Stimmen
Fehler. Welcher Fehler? (In diesem Fall ist es ein bisschen offensichtlich, aber Sie sollten immer den Fehler angeben).
0 Stimmen
'=' : kann nicht von 'int' nach 'void *' konvertieren
0 Stimmen
Ihr Compiler ist seltsam ... was würde er konvertieren wollen von
int
avoid*
angesichts der Aussage*q=10;
? ??? In dieser Erklärung wird die10
hat Typint
und die*q
hat Typvoid
.3 Stimmen
In Ihrem ersten Schnipsel sagen Sie dem Compiler: "q ist ein Zeiger auf eine Art von Daten. Ich sage Ihnen nicht, um welche Art von Daten es sich handelt, denn ich verspreche, dass Sie das nicht wissen müssen." Dann sagen Sie dem Compiler: "Konvertiere 10 in den Datentyp, der sich an der Stelle befindet, auf die q zeigt, und speichere es dort." Da Sie ihm vorher keine Informationen über den Typ gegeben haben, kann er das nicht tun.