Eu li que converter um ponteiro de função em um ponteiro de dados e vice-versa funciona na maioria das plataformas, mas não é garantido que funcione. Por que esse é o caso? Os dois não deveriam ser simplesmente endereços na memória principal e, portanto, ser compatíveis?
void
. A conversão de um ponteiro de função para void *
não deve alterar a representação. Um void *
valor resultante dessa conversão pode ser convertido novamente no tipo de ponteiro da função original, usando uma conversão explícita, sem perda de informações. Nota : O padrão ISO C não exige isso, mas é necessário para conformidade com POSIX.
dlsym()
- observe o final da seção 'Uso de aplicativos', onde diz: Observe que a conversão de um void *
ponteiro para um ponteiro de função como em: fptr = (int (*)(int))dlsym(handle, "my_function");
não é definida pelo padrão ISO C. Este padrão requer que esta conversão funcione corretamente em implementações em conformidade.