Un puntatore a funzione contiene l'indirizzo di una funzione, indipendentemente dal significato di un determinato sistema. È possibile utilizzarlo per chiamare la funzione indirettamente, è possibile assegnare e confrontare i valori del puntatore della funzione. È inoltre possibile convertire un puntatore a funzione in un altro tipo puntatore-a-funzione e così via.
Il modo più semplice per un compilatore di implementare un puntatore a funzione è l'indirizzo di memoria della funzione e la maggior parte dei compilatori lo fa in questo modo, ma lo standard di lingua non lo specifica. Alcuni sistemi (penso che l'AS/400 di IBM sia un esempio) memorizzano informazioni aggiuntive nei puntatori di funzione. Un compilatore può implementare i puntatori di funzioni come indici interi in una tabella di descrittori, purché la semantica richiesta sia implementata correttamente.
Non è possibile annullare la ricerca di un puntatore a funzione. Una chiamata di funzione richiede un puntatore, non un nome di funzione, come espressione di prefisso; se si utilizza un nome di funzione, tale nome viene convertito implicitamente in un puntatore (per quanto riguarda la lingua, il codice macchina generato potrebbe essere diverso). Quindi non esiste un modo portatile per un programma per rilevare se i puntatori di funzione contengono effettivamente indirizzi di memoria o meno.
non-portabile, data una funzione func
, si può fare qualcosa di simile:
printf("Address of func is %p\n", (void*)func);
e ti probabilmente vedere qualcosa che assomiglia a una rappresentazione leggibile di un indirizzo di memoria.Ma in senso stretto, il comportamento della conversione del puntatore alla funzione void*
non è definito dalla lingua e potrebbe non funzionare su alcuni sistemi.
È possibile che sia in grado di convertire un puntatore a unsigned char*
ed esaminare il codice macchina della funzione, ma va ben oltre quanto definito dallo standard C.
È consigliabile trattare i puntatori di funzione come valori opachi che fanno riferimento a funzioni particolari in un modo non specificato.
fonte
2014-03-07 16:24:59
Stai vedendo gli accessi illegali alla memoria sui puntatori di funzione o su altri puntatori? –
Che cosa significa "ci troviamo di fronte a molti errori nei puntatori a causa di un accesso illegale alla memoria"? Come si verificano questi errori? Quali sono questi errori? –
@Steve No @ S.Lot Mi riferivo agli errori che si ottengono quando inizializziamo int * in un po 'di spazzatura che è un indirizzo di memoria protetto. –