3 Stimmen

Referenzierungsproblem in einem void *-Zeiger?

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?

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 a void* angesichts der Aussage *q=10; ? ??? In dieser Erklärung wird die 10 hat Typ int und die *q hat Typ void .

5voto

Jonathan Leffler Punkte 694013

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.

4voto

Alexandre C. Punkte 53706

Jeder Zeiger kann in void* , aber es ist illegal, einen Zeiger auf void .

1voto

BlackBear Punkte 21476

Der erste Ausschnitt lautet undefiniertes Verhalten .

1voto

R. Martinho Fernandes Punkte 217895

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 .

1voto

Mateen Ulhaq Punkte 21111

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

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.

Powered by:

X