Da C99 spec, paragrafo 6.2.5, punto 27:
Un puntatore a void devono avere la stessa rappresentazione ed allineamento requisiti come un puntatore a un tipo carattere. Allo stesso modo, i puntatori per le versioni qualificate o non vuote dei tipi compatibili devono avere la stessa rappresentazione e i requisiti di allineamento . Tutti i puntatori ai tipi di struttura devono avere la stessa rappresentazione e i requisiti di allineamento tra loro. Tutti i puntatori ai tipi di unione devono avere lo stesso identici requisiti di allineamento e di corrispondenza . I puntatori per altri tipi non devono avere la stessa rappresentazione o allineamento requisiti.
Quindi no; nessuna garanzia che un void *
possa contenere un puntatore a funzione.
E sezione 6.3.2.3, paragrafo 8:
Un puntatore a una funzione di un tipo può essere convertito in un puntatore a una funzione di altro tipo e viceversa nuovo; il risultato deve confrontare lo uguale al puntatore originale.
che implica che un tipo di puntatore a funzione può contenere qualsiasi altro valore di puntatore di funzione. Tecnicamente, ciò non equivale a garantire che i tipi di puntatore a funzione non possano variare di dimensioni, ma semplicemente che i loro valori occupino lo stesso intervallo l'uno dell'altro.
fonte
2010-10-15 11:42:03
Più in generale: qualsiasi puntatore a funzione può essere convertito in qualsiasi altro tipo di puntatore a funzione e viceversa. (C99 6.3.2.3/8) – schot
@schot: giusto, in tal caso sarebbe davvero perverso renderli di dimensioni diverse, poiché indipendentemente dalla dimensione tutti i tipi di puntatori a funzione devono rappresentare esattamente lo stesso insieme di valori. Vale a dire, l'indirizzo di ogni funzione, oltre a un puntatore nullo. –
Ottima risposta. La mia domanda dell'altra giornata illustra potenziali insidie qui: http://stackoverflow.com/questions/3889541/issue-with-null-pointers-on-harvard-architecture-platform – Vicky