2011-09-01 19 views
5

Questo codice:problema di riferimento nel puntatore void *?

int p = 10; 
void *q; 
*q = 10; 

non può essere compilato:

'=': impossibile convertire da 'int' a 'void *'

Tuttavia, questo codice compila bene:

int p = 10; 
void *q; 
q = &p; 

Qual è la causa?

+0

Errore. Che errore? (In questo caso, è un po 'ovvio, ma dovresti sempre postare l'errore.) –

+0

' = ': impossibile convertire da' int 'a' void * ' – teacher

+0

Il tuo compilatore è strano ... che vorrebbe convertire da 'int' to' void * 'data l'istruzione' * q = 10; '? ??? In questa affermazione, il '10' ha tipo' int' e '* q' ha tipo' void'. – pmg

risposta

5

A void * punti di dati di un tipo sconosciuto (se viene inizializzato, che il tuo non è).

È possibile assegnare solo a variabili di un tipo noto o tramite puntatori di un tipo noto.

int p = 10; 
void *q = &p; 

*(int *)q = 20; 

if (p != 20) 
    ...something has gone horribly wrong... 

Questo converte il void * in un int * e poi assegna un valore a quello puntatore intero Dereferenced.

4

Qualsiasi puntatore può essere convertito in void*, ma è illegale dereferenziare un puntatore a void.

+3

diavolo si, non puoi scrivere qualcosa che non porta a nulla. – kenny

1

Il primo snippet è comportamento non definito.

0

Non è possibile annullare la ricerca di un puntatore del vuoto. E anche se tu potessi, il tuo codice scriverà su un indirizzo di memoria casuale e probabilmente si bloccherà.

Nel secondo blocco di codice si assegna l'indirizzo del puntatore che funziona bene perché si può assegnare qualsiasi indirizzo di memoria a una void*

1

Le due parti di codice (provate a) fanno cose diverse.

Il primo tenta di assegnare il valore 10 all'oggetto q punti. Ci sono due problemi qui. Innanzitutto non hai mai inizializzato il puntatore. Devi farlo puntare da qualche parte prima di poter cambiare il valore di ciò a cui punta. E in secondo luogo, non è possibile annullare la chiamata void* perché il tipo non è noto.

Il secondo pezzo di codice assegna l'indirizzo della variabile p a q. Dopodiché, q punterà all'oggetto archiviato in p.

1

Questo cambia l'indirizzo in memoria q punti:

q = &p; 

Questo non può capire il tipo di ciò q punti da (int, long, std::string, int**, ecc); tutto ciò che sa è la posizione in memoria:

*q = 10; 

Si potrebbe fare:

int *iq = static_cast<int*>(q); 
*iq = 10; 

Si consiglia di saperne di più su void*s.

2

vuoto * non sa quanto regge e cosa contiene?

in modo da poter assegnare qualsiasi tipo di puntatore ad esso perché può contenere qualsiasi dimensione in esso! Ma non è possibile assegnare un valore perché non sa cosa deve memorizzare ...!

0

il puntatore q non punta a nessuna posizione di memoria. quindi non puoi assegnare un valore ad esso.

Problemi correlati